ggplot2 выводит два набора данных в одну картинку
Это должно быть FAQ, но я не могу найти точно такой же пример в других ответах (не стесняйтесь закрыть это, если вы можете указать аналогичные вопросы и ответы). Я все еще новичок в ggplot2 и, похоже, не могу так легко обернуться вокруг него.
У меня есть 2 data.frames (которые взяты из разных смешанных моделей), и я пытаюсь представить их оба в одном графике. Data.frames являются:
newdat
id Type pred SE
1 1 15.11285 0.6966029
2 1 13.68750 0.9756909
3 1 13.87565 0.6140860
4 1 14.61304 0.6187750
5 1 16.33315 0.6140860
6 1 16.19740 0.6140860
1 2 14.88805 0.6966029
2 2 13.46270 0.9756909
3 2 13.65085 0.6140860
4 2 14.38824 0.6187750
5 2 16.10835 0.6140860
6 2 15.97260 0.6140860
а также
newdat2
id pred SE
1 14.98300 0.6960460
2 13.25893 0.9872502
3 13.67650 0.6150701
4 14.39590 0.6178266
5 16.37662 0.6171588
6 16.08426 0.6152017
Как видите, второй data.frame не имеет Type
в то время как первый делает, и, следовательно, имеет 2 значения для каждого id
,
Что я могу сделать с ggplot, так это заговор, например:
рисунок 1
fig2
Как вы можете видеть, на рис 1 ids
сложены Type
на оси х, чтобы сформировать две группы из 6 ids
, Однако на рисунке 2 нет Type
но вместо всего 6 ids
,
Что я хотел бы сделать, так это нарисовать рис. 2 слева / справа от рис. 1 с аналогичной группировкой. Таким образом, полученный график будет выглядеть как на рисунке 1, но с 3 группами по 6 ids
,
Проблема также в том, что мне нужно пометить и организовать полученную цифру так, чтобы для newdat
ось х будет включать метку для "модель1" и для newdat2
ярлык для "model2" или какой-то аналогичный индикатор, что они от разных моделей. И что еще хуже, мне нужны ярлыки для Type
в newdat
,
Мой (надеюсь) воспроизводимый (но явно очень плохой) код для рис. 1:
library(ggplot2)
pd <- position_dodge(width=0.6)
ggplot(newdat,aes(x=Type,y=newdat$pred,colour=id))+
geom_point(position=pd, size=5)
geom_linerange(aes(ymin=newdat$pred-1.96*SE,ymax=newdat$pred+1.96*SE), position=pd, size=1.5, linetype=1) +
theme_bw() +
scale_colour_grey(start = 0, end = .8, name="id") +
coord_cartesian(ylim=c(11, 18)) +
scale_y_continuous(breaks=seq(10, 20, 1)) +
scale_x_discrete(name="Type", limits=c("1","2"))
Код для рис 2 идентичен, но без limits
в последней строке и с id
определено для оси X в ggplot(aes())
Как я понимаю, определяя вещи на ggplot()
делает этот материал "стандартным" по всему графику, и я попытался удалить общие вещи и отдельно определить geom_point
а также geom_linerange
для обоих newdat
а также newdat2
, но пока не повезло... Любая помощь очень ценится, так как я полностью застрял.
1 ответ
Как насчет добавления сначала добавления новых переменных в каждый набор данных, а затем их объединения:
newdat$model <- "model1"
newdat2$model <- "model2"
newdat2$Type <- 3
df <- rbind(newdat, newdat2)
# head(df)
Тогда мы можем построить с:
library(ggplot2)
ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
geom_point(position = position_dodge(width = 0.6), size = 5) +
geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE),
position = position_dodge(width = 0.6),
size = 1.5, linetype = 1)
Кроме того, вы передаете дополнительную эстетику geom_linerange
для дальнейшего определения типа модели:
ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
geom_point(position = position_dodge(width = 0.6), size = 5) +
geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE, linetype = model),
position = position_dodge(width = 0.6),
size = 1.5)
Наконец, вы можете рассмотреть facets
:
ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
geom_point(position = position_dodge(width = 0.6), size = 5) +
geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE),
position = position_dodge(width = 0.6),
size = 1.5) +
facet_wrap(~ id)