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

http://i.imgur.com/br7yZYD.png

fig2

http://i.imgur.com/1ikMPy6.png

Как вы можете видеть, на рис 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)

Участок 01

Кроме того, вы передаете дополнительную эстетику 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)

Участок 02

Наконец, вы можете рассмотреть 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)

Сюжет 03 - Грани

Другие вопросы по тегам