R: Как разнести (дрожать) точки относительно оси x?

У меня есть следующий фрагмент кода в R:

dat <- data.frame(cond = factor(rep("A",10)), 
                  rating = c(1,2,3,4,6,6,7,8,9,10))
ggplot(dat, aes(x=cond, y=rating)) +
  geom_boxplot() + 
  guides(fill=FALSE) +
  geom_point(aes(y=3)) +
  geom_point(aes(y=3)) +
  geom_point(aes(y=5))

Этот конкретный фрагмент кода создает ящичковую диаграмму, в которой одна точка проходит над другой (в приведенном выше случае одна точка 3 проходит над другой точкой 3).

Как я могу переместить точку 3 так, чтобы точка оставалась в том же положении по оси y, но немного смещалась влево или вправо по оси x?


person chao    schedule 14.07.2015    source источник


Ответы (3)


Этого можно добиться с помощью функции position_jitter:

geom_point(aes(y=3), position = position_jitter(w = 0.1, h = 0))

Обновление: чтобы построить только три предоставленные точки, вы можете построить новый набор данных и построить его:

points_dat <- data.frame(cond = factor(rep("A", 3)), rating = c(3, 3, 5))                  
ggplot(dat, aes(x=cond, y=rating)) +
  geom_boxplot() + 
  guides(fill=FALSE) +
  geom_point(aes(x=cond, y=rating), data = points_dat, position = position_jitter(w = 0.05, h = 0)) 
person Lars Lau Raket    schedule 14.07.2015
comment
большое спасибо за быстрый ответ. Да, в свое время я тоже так пробовал. Проблема в том, что когда я использую функцию джиттера, она отображает много точек. Итак, в моем примере у меня есть три точки, две в позиции 3, но когда я добавляю position_jitter, на графике отображается более 10 точек. У вас есть идеи, почему? - person chao; 14.07.2015
comment
Именно то, что мне было нужно! Спасибо! - person chao; 14.07.2015

ggplot2 теперь включает position_dodge(). Из описания справки: «Осветление сохраняет вертикальное положение геометрического объекта при настройке горизонтального положения.».

Таким образом, вы можете использовать его как geom_point(position = position_dodge(0.5)) или, если вы хотите уклоняться от точек, которые соединены линиями, и вам нужно, чтобы уклонение было одинаковым для обоих геометрий, вы можете использовать что-то вроде:

dat <- data.frame(cond = rep(c("A", "B"), each=10), x=rep(1:10, 2), y=rnorm(20))
dodge <- position_dodge(.3) # how much jitter on the x-axis?
ggplot(dat, aes(x, y, group=cond, color=cond)) + 
  geom_line(position = dodge) + 
  geom_point(position = dodge)
person Florian    schedule 23.01.2018

ggplot2 теперь имеет отдельный geom для этого с именем geom_jitter, поэтому вам не нужны аргументы position = dodge или position = position_dodge()). Здесь применяется к примеру ОП:

dat <- data.frame(cond = factor(rep("A",10)), 
                  rating = c(1,2,3,4,6,6,7,8,9,10))
ggplot(dat, aes(x=cond, y=rating)) +
  geom_boxplot() + 
  guides(fill=FALSE) +
  geom_jitter(aes(y=c(3, 3, 5)))
person Andrew Morris    schedule 20.10.2020