Ограничить оси ggplot2 без удаления данных (вне пределов): увеличение

Если вы задаете пределы оси в ggplot, удаленные точки удаляются. Это хорошо для точек, но вы можете построить линии, которые пересекаются с указанным диапазоном, но ggplot range или же xlim/ylim методы удаляют это. Есть ли другой способ указать диапазон оси графика без удаления внешних данных?

например

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)

2 ответа

Решение

Хэдли объясняет это на стр. 99; 133 из его книги ggplot2 (1-е издание), или с. 160 - 161, если у вас есть второе издание

Проблема в том, что, как вы говорите, limits внутри шкалы или настройки ylim вызывает выброс данных, поскольку они ограничивают данные. Для истинного масштабирования (сохраните все данные) вам необходимо установить пределы внутри декартовой системы координат. Для получения дополнительной информации см.: http://docs.ggplot2.org/current/coord_cartesian.html

ggplot(d, aes(x, y, group=grp)) + geom_line() + 
    coord_cartesian(ylim=c(0, 7))

введите описание изображения здесь

Просто для полноты вот визуальное руководство по этому поведению:

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

Другие вопросы по тегам