Elimine la cuadrícula, el color de fondo y los bordes superior y derecho de ggplot2

104

Me gustaría reproducir la trama inmediatamente debajo usando ggplot2. Puedo acercarme, pero no puedo eliminar los bordes superior y derecho. A continuación, presento varios intentos de uso de ggplot2, incluidas varias sugerencias que se encuentran en o a través de Stackoverflow. Desafortunadamente, no he podido hacer que esas sugerencias funcionen.

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())
Mark Miller
fuente
3
como se publica en un comentario a continuación, esto ahora se puede hacer con + theme_classic ()
nsheff

Respuestas:

134

EDITAR Ignore esta respuesta. Ahora hay mejores respuestas. Vea los comentarios. Utilizar+ theme_classic()

EDITAR

Esta es una mejor versión. 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 tanto el panel.bordercomo panel.backgroundpara 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()) 

ingrese la descripción de la imagen aquí

Publicación original Esto se acerca. Hubo un error al axis.lineno funcionar en el eje y ( ver aquí ), que parece no estar corregido todavía. 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 están recortados, pero el recorte se puede deshacer usando el código de baptiste .

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

ingrese la descripción de la imagen aquí

O utilice limitspara 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)
Sandy Muspratt
fuente
Gracias por tu linda explicación. ¡Voto a favor!
Mohamed Rahouma hace
76

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(). La respuesta de Sandy seguirá generando un gráfico (a partir de enero de 2012), pero hace que R lance un montón de advertencias.

Aquí está el código actualizado que refleja la sintaxis actual de ggplot:

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:

salida de la trama

Andrés
fuente
33
o más simplemente? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650
Ninguno de estos enfoques funciona para mí usando ggplot2 2.1.0 ... La respuesta de @ wkretzsch fue buena.
Nova
25

Una alternativa theme_classic()es el tema que viene con el paquete cowplottheme_cowplot() (cargado automáticamente con el paquete). Se parece a theme_classic(), con algunas diferencias sutiles. Lo más importante es que los tamaños de etiqueta predeterminados son más grandes, por lo que las cifras resultantes se pueden usar en publicaciones sin necesidad de realizar más modificaciones (en particular si las guarda con en save_plot()lugar de ggsave()). Además, el fondo es transparente, no blanco, lo que puede resultar útil si desea editar la figura en Illustrator. Finalmente, las parcelas 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

Así es como se ve el archivo plot.pngproducido por este código: ingrese la descripción de la imagen aquí

Descargo de responsabilidad: soy el autor del paquete.

Claus Wilke
fuente
8

Seguí la respuesta de Andrew , 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 vez de

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

solía

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

Las opciones anteriores no funcionan para mapas creados con sfy geom_sf(). Por lo tanto, quiero agregar el ndiscrparámetro relevante aquí. Esto creará un mapa limpio y agradable que muestra solo las características.

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
fuente
1

La simplificación de la respuesta de Andrew anterior conduce a este tema clave para generar la mitad del borde.

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

Aquí hay una respuesta extremadamente simple.

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

Es fácil. Fuente: final de este artículo

stevec
fuente