Limitar los ejes de ggplot2 sin eliminar datos (fuera de los límites): zoom

Resuelto geotheory asked hace 54 años • 3 respuestas

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 rangeo de ggplot xlim/ylimlas 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)
geotheory avatar Jan 01 '70 08:01 geotheory
Aceptado

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, limitsdentro 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))

ingrese la descripción de la imagen aquí

Tyler Rinker avatar Sep 05 '2014 12:09 Tyler Rinker

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

ingrese la descripción de la imagen aquí

p + 
  scale_y_continuous(limits = c(1, 4)) 

ingrese la descripción de la imagen aquí

p + 
  coord_flip(ylim = c(1, 4))

ingrese la descripción de la imagen aquí

p + 
  coord_flip(ylim = c(1, 4),
             clip = 'off') 

ingrese la descripción de la imagen aquí

Arthur Welle avatar Feb 24 '2023 23:02 Arthur Welle