Limitar los ejes de ggplot2 sin eliminar datos (fuera de los límites): zoom
Si especifica límites de eje en ggplot, se eliminan los puntos periféricos. Esto está bien para puntos, pero es posible que desee trazar líneas que se crucen con el rango especificado, pero los métodos range
o de ggplot xlim/ylim
las eliminan. ¿Existe otra forma de especificar el rango del eje del gráfico sin eliminar datos atípicos?
p.ej
require(ggplot2)
d = data.frame(x=c(1,4,7,2,9,7), y=c(2,5,4,10,5,3), grp=c('a','a','b','b','c','c'))
ggplot(d, aes(x, y, group=grp)) + geom_line()
ggplot(d, aes(x, y, group=grp)) + geom_line() + scale_y_continuous(limits=c(0,7))
ggplot(d, aes(x, y, group=grp)) + geom_line() + ylim(0,7)
Hadley explica esto en las páginas 99; 133 de su libro ggplot2 (1.ª edición) , o págs. 160 - 161 si tiene la segunda edición .
El problema es que, como usted dice, limits
dentro de la escala o configuración ylim()
se desechan datos, ya que los están restringiendo. Para un verdadero zoom (conservar todos los datos), debe establecer los límites dentro del sistema de coordenadas cartesiano (u otros sistemas de coordenadas https://ggplot2.tidyverse.org/reference/#section-coordinate-systems ). Para obtener más información, consulte: http://docs.ggplot2.org/current/coord_cartesian.html
ggplot(d, aes(x, y, group=grp)) +
geom_line() +
coord_cartesian(ylim=c(0, 7))
Sólo para completar, aquí está la guía visual de este comportamiento:
df <- data.frame(
trt = c( 2, 3, 3.8, 5, 6),
resp = c( 2.5, 3, 3.8, 3, 3.8),
upper = c( 3, 3.3, 4.5, 3.3, 4.5),
lower = c( 2, 2.4, 3.4, 2.4, 3.4)
)
p <- ggplot() +
geom_point(data = df,
aes(x = trt,
y = resp)) +
geom_errorbar(data = df,
aes(x = trt,
y = resp,
ymin = lower,
ymax = upper),
width = 0) +
coord_flip() +
theme_bw() +
theme(plot.margin = margin(0.5, 3, 0.5, 0.5, "cm"))
p
p +
scale_y_continuous(limits = c(1, 4))
p +
coord_flip(ylim = c(1, 4))
p +
coord_flip(ylim = c(1, 4),
clip = 'off')