2012-06-02 27 views
68

Me gustaría reproducir la gráfica inmediatamente debajo usando ggplot2. Puedo acercarme, pero no puedo quitar los bordes superior y derecho. A continuación, presento varios intentos con ggplot2, incluidas varias sugerencias que se encuentran en Stackoverflow oa través de este. Desafortunadamente no he podido hacer que esas sugerencias funcionen.Eliminar la cuadrícula, el color de fondo y los bordes superior y derecho de ggplot2

Espero que alguien pueda corregir uno o más de los siguientes fragmentos de código.

Gracias por cualquier sugerencia.

# 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

tal como fue anunciado en un comentario más abajo, esto ahora se puede hacer con + theme_classic() – nsheff

Respuesta

88

EDITAR haga caso de esta respuesta. Ahora hay mejores respuestas. Ver los comentarios. Utilice + theme_classic()

EDITAR

Ésta es una versión mejor. El error mencionado a continuación en la publicación original permanece (creo). Pero la línea del eje se dibuja debajo del panel. Por lo tanto, elimine ambos panel.border y panel.background para ver las líneas del eje.

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

Post original Esto se acerca. Hubo un error con axis.line que no funcionaba en el eje y (see here), que parece que aún no se ha corregido. Por lo tanto, después de quitar el borde del panel, el eje y debe dibujarse por separado usando 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 

Los puntos extremos se recortan, pero el recorte se pueden deshacer utilizando el código de baptiste.

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

enter image description here

O utilice limits para mover los límites del panel.

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

Creo que probablemente debería dar a la marca de verificación a la otra respuesta ahora. Tu respuesta fue totalmente merecedora de la marca de verificación en 2012 y fue extremadamente útil. Sin embargo, la otra respuesta parece mejor ahora. Sin embargo, odio cambiar las marcas de verificación, aunque solo sea por razones históricas. –

+2

Si fuera yo, lo hubiera hecho hace 12 meses. –

71

Las actualizaciones recientes de ggplot (0.9.2+) han revisado la sintaxis de los temas. En particular, opts() ahora está en desuso, después de haber sido reemplazado por theme(). Sandy's la respuesta todavía (a partir de enero de 2012) genera un gráfico, pero hace que R arroje un montón de advertencias.

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

genera::

Aquí está el código que refleja la sintaxis ggplot actual actualizan

plot output

+29

o más simplemente? ggplot (df, aes (x = a, y = b)) + geom_point() + theme_classic() – user20650

+0

Ninguno de estos enfoques me funciona usando ggplot2 2.1.0 ... la respuesta de @wkretzsch fue buena. – Nova

17

Una alternativa a theme_classic() es el tema que viene con el paquete cowplot, theme_cowplot() (carga automáticamente con el paquete). Se parece a theme_classic(), con algunas diferencias sutiles. Lo que es más importante, los tamaños de etiqueta predeterminados son más grandes, por lo que las cifras resultantes se pueden utilizar en publicaciones sin necesidad de modificaciones adicionales (en particular, si las guarda con save_plot() en lugar de ggsave()).Además, el fondo es transparente, no blanco, lo que puede ser útil si desea editar la figura en Illustrator. Finalmente, las trazas facetadas se ven mejor, en mi opinión.

Ejemplo:

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 

Esto es lo que el archivo plot.png producido por este código es el siguiente: enter image description here

responsabilidad: yo soy el autor del paquete.

7

Seguí Andrew's answer, pero también tuve que seguir https://stackoverflow.com/a/35833548 y configurar los ejes xey por separado debido a un error en mi versión de ggplot (v2.1.0).

En lugar de

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

que utilizan

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

Muy buena respuesta. Nada más funcionó para mí, creo que este error debería estar mejor documentado. – thiagoveloso

Cuestiones relacionadas