Entfernen Sie Gitter, Hintergrundfarbe sowie den oberen und rechten Rand von ggplot2

103

Ich möchte den Plot direkt darunter mit ggplot2 reproduzieren. Ich kann nahe kommen, aber den oberen und rechten Rand nicht entfernen. Im Folgenden stelle ich einige Versuche mit ggplot2 vor, einschließlich einiger Vorschläge, die auf oder über Stackoverflow gefunden wurden. Leider konnte ich diese Vorschläge nicht zum Laufen bringen.

Ich hoffe, dass jemand in der Lage ist, einen oder mehrere der folgenden Codefragmente zu korrigieren.

Vielen Dank für Anregungen.

# desired plot
a <- seq(1,20)
b <- a^0.25
plot(a,b, bty = "l")


library(ggplot2)

df <- as.data.frame(cbind(a,b))

# 1. ggplot2 default
ggplot(df, aes(x = a, y = b)) + geom_point()

# 2. removes background color
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black'))

# 3. also removes gridlines
none <- theme_blank()
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none)

# 4. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = none)

# 5. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(axis.line = theme_segment())

# 6. removes x and y axis in addition to top and right border
# http://stackoverflow.com/questions/5458409/remove-top-and-right-border-from-ggplot2
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.background=theme_rect(colour=NA))

# 7. returns error when attempting to remove top and right border
# https://groups.google.com/group/ggplot2/browse_thread/thread/f998d113638bf251
#
# Error in el(...) : could not find function "polylineGrob"
#
theme_L_border <- function(colour = "black", size = 1, linetype = 1) { 
   structure( 
     function(x = 0, y = 0, width = 1, height = 1, ...) { 
       polylineGrob( 
         x=c(x+width, x, x), y=c(y,y,y+height), ..., default.units = "npc", 
         gp=gpar(lwd=size, col=colour, lty=linetype), 
       ) 
     }, 
     class = "theme", 
     type = "box", 
     call = match.call() 
   )
}

ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts( panel.border = theme_L_border())
Mark Miller
quelle
3
Wie in einem Kommentar unten gepostet, kann dies jetzt mit + theme_classic ()
nsheff

Antworten:

133

BEARBEITEN Ignorieren Sie diese Antwort. Es gibt jetzt bessere Antworten. Siehe die Kommentare. Verwenden+ theme_classic()

BEARBEITEN

Dies ist eine bessere Version. Der unten im ursprünglichen Beitrag erwähnte Fehler bleibt bestehen (glaube ich). Die Achsenlinie wird jedoch unter dem Bedienfeld gezeichnet. Entfernen Sie daher sowohl die panel.borderals auch panel.background, um die Achsenlinien anzuzeigen.

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

ggplot(df, aes(x = a, y = b)) + geom_point() +
  theme_bw() +
  theme(axis.line = element_line(colour = "black"),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    panel.background = element_blank()) 

Geben Sie hier die Bildbeschreibung ein

Originaler Beitrag Dies kommt näher. Es gab einen Fehler, bei dem axis.lineauf der y-Achse nicht gearbeitet wurde ( siehe hier ), der noch nicht behoben zu sein scheint. Daher muss nach dem Entfernen des Bedienfeldrandes die y-Achse separat mit gezeichnet werden geom_vline.

library(ggplot2)
library(grid)

a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

p = ggplot(df, aes(x = a, y = b)) + geom_point() +
   scale_y_continuous(expand = c(0,0)) +
   scale_x_continuous(expand = c(0,0)) +
   theme_bw() +
   opts(axis.line = theme_segment(colour = "black"),
        panel.grid.major = theme_blank(),
        panel.grid.minor = theme_blank(),
        panel.border = theme_blank()) +
    geom_vline(xintercept = 0)
p

Die Extrempunkte werden abgeschnitten, aber das Ausschneiden kann mithilfe des Codes von baptiste rückgängig gemacht werden .

gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)

Geben Sie hier die Bildbeschreibung ein

Oder verwenden Sie limits, um die Grenzen des Bedienfelds zu verschieben.

ggplot(df, aes(x = a, y = b)) + geom_point() +
   xlim(0,22) +  ylim(.95, 2.1) +
   scale_x_continuous(expand = c(0,0), limits = c(0,22)) +
   scale_y_continuous(expand = c(0,0), limits = c(.95, 2.2)) +   
   theme_bw() +
   opts(axis.line = theme_segment(colour = "black"),
        panel.grid.major = theme_blank(),
        panel.grid.minor = theme_blank(),
        panel.border = theme_blank()) +
    geom_vline(xintercept = 0)
Sandy Muspratt
quelle
76

Die jüngsten Aktualisierungen von ggplot (0.9.2+) haben die Syntax für Themen überarbeitet. Vor allem opts()ist jetzt veraltet, ersetzt durch theme(). Sandys Antwort generiert immer noch (Stand: 12. Januar) ein Diagramm, veranlasst R jedoch, eine Reihe von Warnungen auszulösen.

Hier ist aktualisierter Code, der die aktuelle ggplot-Syntax widerspiegelt:

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

#base ggplot object
p <- ggplot(df, aes(x = a, y = b))

p +
  #plots the points
  geom_point() +

  #theme with white background
  theme_bw() +

  #eliminates background, gridlines, and chart border
  theme(
    plot.background = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank()
  ) +

  #draws x and y axis line
  theme(axis.line = element_line(color = 'black'))

erzeugt:

Plotausgabe

Andrew
quelle
33
oder einfacher? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650
Keiner dieser Ansätze funktioniert für mich mit ggplot2 2.1.0 ... @ wkretzschs Antwort war gut.
Nova
24

Eine Alternative zu theme_classic()ist das Thema, das mit dem Cowplot- Paket geliefert wird theme_cowplot()(wird automatisch mit dem Paket geladen). Es sieht ähnlich aus theme_classic(), mit ein paar subtilen Unterschieden. Am wichtigsten ist, dass die Standardetikettengrößen größer sind, sodass die resultierenden Zahlen in Veröffentlichungen verwendet werden können, ohne dass weitere Änderungen erforderlich sind (insbesondere, wenn Sie sie mit save_plot()statt speichern ggsave()). Außerdem ist der Hintergrund transparent und nicht weiß. Dies kann hilfreich sein, wenn Sie die Abbildung im Illustrator bearbeiten möchten. Schließlich sehen facettierte Handlungen meiner Meinung nach besser aus.

Beispiel:

library(cowplot)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

p <- ggplot(df, aes(x = a, y = b)) + geom_point()
save_plot('plot.png', p) # alternative to ggsave, with default settings that work well with the theme

So plot.pngsieht die von diesem Code erzeugte Datei aus: Geben Sie hier die Bildbeschreibung ein

Haftungsausschluss: Ich bin der Autor des Pakets.

Claus Wilke
quelle
8

Ich folgte Andrews Antwort , musste aber auch https://stackoverflow.com/a/35833548 folgen und die x- und y-Achse aufgrund eines Fehlers in meiner Version von ggplot (v2.1.0) getrennt einstellen.

Anstatt

theme(axis.line = element_line(color = 'black'))

ich benutzte

theme(axis.line.x = element_line(color="black", size = 2),
    axis.line.y = element_line(color="black", size = 2))
winni2k
quelle
3

Die oben genannten Optionen funktionieren nicht für Karten, die mit sfund erstellt wurden geom_sf(). Daher möchte ich ndiscrhier den relevanten Parameter hinzufügen . Dadurch wird eine schöne, saubere Karte erstellt, die nur die Funktionen zeigt.

library(sf)
library(ggplot2)

ggplot() + 
  geom_sf(data = some_shp) + 
  theme_minimal() +                     # white background
  theme(axis.text = element_blank(),    # remove geographic coordinates
        axis.ticks = element_blank()) + # remove ticks
  coord_sf(ndiscr = 0)                  # remove grid in the background
loki
quelle
1

Die Vereinfachung der obigen Antwort von Andrew führt zu diesem Schlüsselthema, um die halbe Grenze zu erzeugen.

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))
Sibo Jiang
quelle
0

Hier ist eine sehr einfache Antwort

yourPlot +
  theme(
    panel.border = element_blank(), 
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(), 
    axis.line = element_line(colour = "black")
    )

So einfach ist das. Quelle: das Ende dieses Artikels

stevec
quelle