2012-06-02 5 views
68

Ich möchte das Diagramm direkt unter Verwendung von ggplot2 reproduzieren. Ich kann nahe kommen, kann aber die oberen und rechten Ränder nicht entfernen. Im Folgenden zeige ich einige Versuche mit ggplot2, einschließlich mehrerer Vorschläge, die auf oder über Stackoverflow gefunden wurden. Leider konnte ich diese Vorschläge nicht umsetzen.Entfernen Sie Gitter, Hintergrundfarbe und obere und rechte Ränder von ggplot2

ich jemand bin der Hoffnung, der Lage sein, kann eine oder mehrere der Code zu korrigieren Schnipsel unten.

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

wie unten in einem Kommentar geschrieben, kann dies jetzt mit + erfolgen theme_classic() – nsheff

Antwort

88

EDIT Ignorieren Sie diese Antwort. 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 wird, bleibt (denke ich). Aber die Achsenlinie wird unter dem Panel gezeichnet. Entfernen Sie daher die panel.border und 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

Original-Beitrag Das nahe kommt. Es gab einen Fehler mit axis.line nicht auf der y-Achse (see here), die scheint noch nicht behoben zu sein. Daher muss nach dem Entfernen der Panel-Grenze die y-Achse separat mit geom_vline eingezeichnet 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, aber die Abschneide kann durch baptiste mit Code 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 nutzen limits die Grenzen der Platte zu bewegen.

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) 
+3

Ich glaube, ich sollte wohl das Häkchen die geben andere Antwort jetzt. Sie haben das Häkchen im Jahr 2012 absolut verdient und waren sehr hilfreich. Die andere Antwort scheint jetzt jedoch besser zu sein. Ich hasse es, die Häkchen zu wechseln, wenn auch nur aus historischen Gründen. –

+2

Wenn ich es wäre, hätte ich es vor 12 Monaten getan. –

71

Letzte Aktualisierungen zu ggplot (0.9.2+) haben die Syntax für Themen überarbeitet. Am bemerkenswertesten ist opts() ist jetzt veraltet, durch theme() ersetzt worden. Sandy's Antwort wird immer noch (ab Jan '12) generiert ein Diagramm, aber verursacht R eine Reihe von Warnungen zu werfen.

Hier aktualisierte Codestrom ggplot Syntax reflektierende:

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

+29

oder einfacher? ggplot (df, aes (x = a, y = b)) + geom_point() + theme_classic() – user20650

+0

Keines dieser Ansätze funktioniert für mich mit ggplot2 2.1.0 ... @ wkretzschs Antwort war gut. – Nova

17

Eine Alternative zu theme_classic() das Thema ist, die mit dem cowplot Paket kommt, theme_cowplot() (automatisch mit dem geladenen Paket). Es sieht ähnlich aus wie theme_classic(), mit ein paar feinen Unterschieden. Am wichtigsten ist, dass die Standard-Etikettengrößen größer sind, so dass die resultierenden Zahlen in Publikationen ohne weitere Modifikationen verwendet werden können (insbesondere, wenn Sie sie mit save_plot() statt ggsave() speichern).Außerdem ist der Hintergrund transparent, nicht weiß, was nützlich sein kann, wenn Sie die Figur im 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 

Dies ist, was die Datei plot.png durch diesen Code erzeugt wie folgt aussieht: enter image description here

Disclaimer: Ich bin das Paket Autor.

7

Ich folgte Andrew's answer, aber ich musste auch https://stackoverflow.com/a/35833548 folgen und die X- und Y-Achse wegen eines Fehlers in meiner Version von ggplot (v2.1.0) separat einstellen.

Statt

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

benutzte ich

theme(axis.line.x = element_line(color="black", size = 2), 
    axis.line.y = element_line(color="black", size = 2)) 
+0

Sehr coole Antwort. Nichts anderes hat für mich funktioniert - ich denke, dieser Bug sollte besser dokumentiert werden. – thiagoveloso

Verwandte Themen