Подтвердить что ты не робот

Ggplot2 смещение точек разброса

У меня есть два набора точек с ошибками. Я хотел бы компенсировать второй так, чтобы он отображался немного вниз от первого набора, так что он не скрывает оригинал.

Вот набор данных:

x=runif(4,-2,2)
y=c("A","B","C","D")
upper=x+2
lower=x-2
x_1=runif(4,-1,3)
upper_1=x_1+1
lower_1=x_1-2

Вот код, который я использовал для создания графика:

qplot(x,y)+
  geom_point(size=6)+
  geom_errorbarh(aes(xmax=upper,xmin=lower),size=1)+
  geom_point(aes(x_1,y),size=6,pch=8,vjust=-1,col="grey40")+
  geom_errorbarh(aes(xmax=upper_1,xmin=lower_1),size=1,col="grey40")

И вот сюжет:

scatterplot

Я хотел бы, чтобы серые звездочки и связанные бары ошибок отображались на волосах ниже черных кругов и связанных баров ошибок. Я бы преобразовал набор данных, но ось Y является категориальными переменными.

4b9b3361

Ответ 1

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

dodge <- position_dodge(width=0.5)  
p <- ggplot(dfr,aes(x=y,y=x,colour=type)) + 
        geom_point(aes(shape=type),position=dodge) +
        geom_errorbar(aes(ymax=upper,ymin=lower),position = dodge) + 
        scale_colour_manual(values = c('gray','black')) +
        scale_shape_manual(values = c(8,19)) +
        coord_flip() + 
        opts(legend.position="none")

который дает мне этот сюжет:

enter image description here

Примечание. Поскольку версия 0.9.2 opts была заменена на theme:

+ theme(legend.position = "none")

Ответ 2

Реорганизовать данные в фрейм данных.

x = runif(4,-2,2)
x_1 = runif(4,-1,3)
dfr <- data.frame(
  x = c(x, x_1),
  y = rep(c("A","B","C","D"), 2),
  upper = c(x+2, x_1+1),
  lower = c(x-2, x_1-2),
  type = rep(c("alpha", "beta"), each = 4)
)

Добавьте столбец, который является числовой версией фактора y.

dfr$y_numeric <- with(dfr, 
  as.numeric(y) - ifelse(type == "alpha", 0, 0.1)
)

           x y    upper       lower  type y_numeric
1 0.16694617 A 2.166946 -1.83305383 alpha       1.0
2 1.95060734 B 3.950607 -0.04939266 alpha       2.0
3 1.85516860 C 3.855169 -0.14483140 alpha       3.0
4 0.08773196 D 2.087732 -1.91226804 alpha       4.0
5 0.74837995 A 1.748380 -1.25162005  beta       0.9
6 0.61489655 B 1.614897 -1.38510345  beta       1.9
7 2.31641418 C 3.316414  0.31641418  beta       2.9
8 2.62842027 D 3.628420  0.62842027  beta       3.9

Теперь ваш код построения проще.

ggplot(dfr, aes(x, y_numeric, colour = type)) +
  geom_point(size = 6) +
  geom_errorbarh(aes(xmax = upper,xmin = lower), size = 1) +
  scale_colour_grey()

final image with staggered plots

Ответ 3

У Jared Lander есть фантастический script на github, который создает новую функцию position_dodgev для горизонтальных баров ошибок.

Здесь: https://github.com/jaredlander/coefplot/blob/master/R/position.r

И я нашел его в своем оригинальном посте, у которого есть более старая версия, которая в настоящее время не работает с моей установкой ggplot2: http://www.jaredlander.com/2013/02/vertical-dodging-in-ggplot2/

Вы можете использовать его функцию, как если бы position_dodge с geom_errorbar, например,

... + geom_errorbarh(aes(xmin = LowInner, 
    xmax = HighInner), height = 0.5, lwd = 1, position = position_dodgev(height = 0.8))

Это решение сработало для меня, поскольку я обожаю сюжет и не хочу возиться с созданием нового столбца в data.frame.