Как уклониться от линейных ggplots на двух уровнях?
Я хотел бы сделать график диапазона точек, где точки групп не сложены друг на друга. Сюжет должен выглядеть следующим образом:
:
Моя лучшая попытка сделать уклонение - использовать вектор в аргументе dodge:
library(ggplot2)
dat <- structure(list(Treatment = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"),
Temp = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L,
2L, 2L), .Label = c("10", "20"), class = "factor"), Rep = c(1L,
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), Meas = c(3L,
2L, 2L, 2L, 6L, 4L, 4L, 3L, 5L, 1L, 2L, 3L), SD = c(2L, 3L,
2L, 2L, 2L, 3L, 2L, 3L, 3L, 3L, 2L, 1L)), .Names = c("Treatment",
"Temp", "Rep", "Meas", "SD"), row.names = c(NA, -12L), class = "data.frame")
ggplot(dat, aes(x = Treatment, y = Meas, ymin = Meas - SD/2, ymax = Meas + SD/2)) +
geom_linerange(aes(color = Temp), position=position_dodge(width=c(0.6,0.4)), size = 1, alpha = 0.5) +
geom_point(aes(color = Temp, shape = Temp), position=position_dodge(width=c(0.6,0.4)), size = 3) +
theme_bw()
Это приводит к приведенному ниже графику. Тем не менее, все точки не уклоняются, и мне нужно переместить точки и строки ошибок в Illustrator, чтобы показать график выше. Есть ли способ использовать аргумент dodge в ggplot2
на двух уровнях?
![enter image description here]()
Ответы
Ответ 1
Мышление логически, position_dodge
больше подходит для баров. Он работает с lineranges
на одном уровне фактора, однако на втором уровне трудно определить минимальное расстояние между линиями. Хотя вы можете сделать численное различие между факторами, а затем добавить правильную позицию для меток.
dat1<-cbind(dat,aux=rep(1,length(dat[,1])))
dat1<-within(dat1, {aux = unlist(by(aux,Treatment,cumsum))})
dat1$aux<-dat1$aux+as.numeric(dat1$Treatment)*10
ggplot(dat1, aes( x=aux, y = Meas, ymin = Meas - SD/2, ymax = Meas + SD/2)) +
geom_linerange(aes(color = Temp), size = 1, alpha = 0.5) +geom_point(aes(color = Temp, shape = Temp))+
scale_x_continuous("Treatment",breaks=c(13.5,23.5), labels=c("A","B")) + # here you define coordinates for A and B
theme_bw()
![enter image description here]()
Ответ 2
Это не решит проблему с position_dodge()
, но будет обходным путем для этой проблемы.
Добавлена новая переменная x
в исходный фрейм данных. Он содержит координаты x
для точек/линейных связей. Значения в кадре данных должны быть для того, чтобы вы их начертили.
dat$x<-c(0.85,0.9,0.95,1.05,1.1,1.15,1.85,1.9,1.95,2.05,2.1,2.15)
Теперь используйте эту новую переменную как x
, а с scale_x_continuos()
установите разрывы и метки, чтобы получить A
и B
по шкале.
ggplot(dat, aes(x = x, y = Meas, ymin = Meas - SD/2, ymax = Meas + SD/2)) +
geom_linerange(aes(color = Temp), size = 1, alpha = 0.5) +
geom_point(aes(color = Temp, shape = Temp), size = 3) +
theme_bw()+
scale_x_continuous("Treatment",breaks=c(1,2),labels=c("A","B"),limits=c(0.5,2.5))