geom_text - Elimine la cuadrícula, el color de fondo y los bordes superior y derecho de ggplot2
manual ggplot2 (4)
Me gustaría reproducir la trama 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.
Espero que alguien pueda corregir uno o más de los fragmentos de código a continuación.
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())
Las actualizaciones recientes a ggplot (0.9.2+) han revisado la sintaxis de los temas. En particular, opts()
ahora está en desuso, habiendo sido reemplazado por theme()
. respuesta seguirá (a partir de enero de 12) genera un gráfico, pero hace que R arroje un montón de advertencias.
Aquí está el código actualizado que refleja la sintaxis de ggplot actual:
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:
Seguí la respuesta de Andrew , pero también tuve que seguir https://.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''))
solía
theme(axis.line.x = element_line(color="black", size = 2),
axis.line.y = element_line(color="black", size = 2))
Una alternativa a theme_classic()
es el tema que viene con el paquete theme_cowplot()
, theme_cowplot()
(cargado 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 figuras resultantes pueden usarse en publicaciones sin necesidad de modificaciones adicionales (en particular, si las guarda con save_plot()
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 se ve así:
Descargo de responsabilidad: soy el autor del paquete.
EDITAR Ignora esta respuesta. Ahora hay mejores respuestas. Ver los comentarios. Usar + 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, quite tanto panel.border
como 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())
Publicación original Esto se acerca. Hubo un error con axis.line
no funcionaba en el eje y ( ver aquí ), que parece que aún no ha sido arreglado. 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)
O use 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)