wake-up-neo.com

Entfernen Sie das Raster, die Hintergrundfarbe sowie die oberen und rechten Ränder von ggplot2

Ich möchte die Zeichnung direkt unter Verwendung von ggplot2 reproduzieren. Ich kann näher kommen, aber die oberen und rechten Ränder nicht entfernen. Im Folgenden stelle ich einige Versuche mit ggplot2 vor, einschließlich einiger Vorschläge, die in oder über Stackoverflow gefunden wurden. Leider konnte ich diese Vorschläge nicht zum Laufen bringen. 

Ich hoffe, dass jemand einen oder mehrere der folgenden Codeausschnitte korrigieren kann.

Vielen Dank für Ihre 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())
81
Mark Miller

EDIT Diese Antwort ignorieren. Es gibt jetzt bessere Antworten. Siehe die Kommentare. Verwenden Sie + theme_classic()

EDIT

Dies ist eine bessere Version. Der Fehler, der unten im ursprünglichen Beitrag erwähnt wurde, bleibt bestehen (denke ich). Die Achslinie wird jedoch unter dem Panel gezeichnet. Entfernen Sie daher sowohl panel.border als auch panel.background, um die Achsenlinien zu sehen.

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()) 

enter image description here

Ursprünglicher Beitrag Dies wird nahe. Es gab einen Fehler, bei dem axis.line nicht auf der y-Achse funktionierte ( siehe hier ). Daher muss die y-Achse nach dem Entfernen des Rahmens mit geom_vline separat gezeichnet werden.

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, das Abschneiden kann jedoch mit dem Code von baptiste rückgängig gemacht werden. 

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

enter image description here

Oder verwenden Sie limits, um die Grenzen des Panels 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)
108
Sandy Muspratt

Die letzten Updates für ggplot (0.9.2 und höher) haben die Syntax für Designs überarbeitet. Insbesondere ist opts() nun veraltet, nachdem er durch theme() ersetzt wurde. Sandys Antwort wird immer noch (ab Jan '12) ein Diagramm erzeugen, bewirkt jedoch, dass R eine Reihe von Warnungen ausgibt. 

Hier ist der aktualisierte 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:

plot output

73
Andrew

Eine Alternative zu theme_classic() ist das mit dem cowplot package gelieferte Theme theme_cowplot() (wird automatisch mit dem Paket geladen). Es sieht ähnlich aus wie theme_classic(), mit ein paar kleinen Unterschieden. Am wichtigsten ist, dass die Standard-Etikettengröß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() anstelle von ggsave() speichern). Außerdem ist der Hintergrund transparent und nicht weiß. Dies kann nützlich sein, wenn Sie die Figur in Illustrator bearbeiten möchten. Schließlich sehen facettierte Grundstücke 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 sieht die von diesem Code erzeugte Datei plot.png aus: enter image description here

Haftungsausschluss: Ich bin der Paketautor.

19
Claus Wilke

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

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))
8
winni2k

Die Vereinfachung aus 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'))
1
Sibo Jiang

Die oben genannten Optionen funktionieren nicht für Karten, die mit sf und geom_sf() erstellt wurden. Daher möchte ich hier den relevanten ndiscr-Parameter hinzufügen. Dadurch wird eine Nice-Clean-Map 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
0
loki