Точки джиттера в ggplot2 при фиксированных пределах графика

У меня есть ggplot с фиксированными метками и фиксированными ограничениями, установленными в scale_x_continuous. Тогда возникает проблема, когда я хочу применить джиттер:

library(ggplot2)

dat <- data.frame(
  x = rep(c(1, 2), 5),
  y = 1:10
)

gg <- ggplot(dat, aes(x,y)) + geom_jitter(width = 0.5)
gg + 
  scale_x_continuous(breaks = pretty(dat$x), limits = c(1,2))

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

Проблема в том, что точки дрожания не выходят за пределы. Есть ли способ подергивать точки, чтобы обновлялись лимиты? Или мне нужно вручную обновить лимиты в соответствии с шириной дрожания?


person Stéphane Laurent    schedule 29.01.2019    source источник
comment
Я не уверен, что понимаю вариант использования. Если вы хотите отрегулировать пределы графика в зависимости от размера элементов геометрии на графике, какова цель установки ограничений в первую очередь?   -  person Z.Lin    schedule 29.01.2019
comment
@ Z.Lin Это в контексте приложения Shiny. Точки не дрожат, когда пользователь загружает данные, но он может применить дрожание с помощью ползунка. Приложение немного сложное.   -  person Stéphane Laurent    schedule 29.01.2019


Ответы (1)


Возможно, это можно было бы решить, применив джиттер перед ggplot таким образом, чтобы данные после джиттера могли определять вашу ось:

library(dplyr)
dat2 <- dat %>%
  mutate(x2 = jitter(x, amount = 0.3))

ggplot(dat2, aes(x2,y)) + 
  geom_point() + 
  scale_x_continuous(breaks = pretty(dat2$x2), 
                     limits = range(dat2$x2))

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

person Jon Spring    schedule 29.01.2019
comment
Неплохая идея, но я также использую вертикальное дрожание. Хм, я вижу, что можно применить функцию jitter к y. В противном случае у меня была другая идея: извлечь колеблющиеся значения из ggplot_build. Я не знаю, какое решение лучше. +1 в любом случае. В моем сюжете тоже есть грани, я не знаю, вызывает ли это другие сложности. - person Stéphane Laurent; 29.01.2019
comment
Не могли бы вы подробнее объяснить, что стоит за добавлением термина scale_x_continuous()? Другой подход может заключаться в изменении способа применения джиттера, чтобы он не расширял пределы, например mutate(x2 = 0.8*x + 0.2*rnorm(10, 1.5, 0.2)). Это должно потянуть точки внутрь к середине на разную величину. - person Jon Spring; 29.01.2019
comment
Я добавляю scale_x_continuous с фиксированными пределами, потому что хочу, чтобы ось x охватывала все точки. Не уверен, что понимаю (я не всегда хорошо говорю по-английски). Я не хочу, чтобы точка не ограничивалась крупными линиями. - person Stéphane Laurent; 29.01.2019
comment
Когда вы опускаете строку scale_x_continuous, что отличается от того, что вы хотите? - person Jon Spring; 29.01.2019
comment
Представьте, что основные вертикальные линии расположены в точках 10, 20 и 30. Я могу расположить x в точке 35, но мне это не нужно. Итак, я добавляю основную строку на 40. Это яснее? Решил проблему с ggplot_build. - person Stéphane Laurent; 29.01.2019