2016-03-07 5 views
2

это должен быть FAQ, но я не могу найти точно такой же пример в других ответах (не стесняйтесь закрыть это, если вы можете указать аналогичный Q & A). Я все еще новичок с ggplot2 и, похоже, не могу так легко обмануть голову.ggplot2 plot два набора данных в одно изображение

У меня есть 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, является участок либо один, как это:

fig1

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

fig2

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

Как вы можете видеть, на рис 1 ids уложены на Type по оси x, чтобы сформировать две группы из 6 ids. Однако на рис. 2 нет Type, но вместо этого только 6 ids.

То, что я хотел бы сделать, - это построить рис. 2 слева/справа от fig1 с аналогичной группировкой. Таким образом, полученный график будет выглядеть как рис. 1, но с 3 группами из 6 ids.

Проблема также в том, что мне нужно маркировать и упорядочивать полученную фигуру так, чтобы для newdat ось x включала метку для «model1» и для newdat2 метку для «model2» или какой-либо аналогичный индикатор, который они из разных моделей. И чтобы еще хуже, мне нужны метки для Type в newdat.

My (надеюсь) воспроизводимые (но, очевидно, очень плохо) код для рис 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 определена для оси х в ggplot(aes())

Как я понимаю, определяя материал в ggplot() делает этот материал «стандарт» по всей графике, и я попытался удалить общий материал и отдельно определяют geom_point и geom_linerange для обоих newdat и newdat2, но пока не повезло ... Любая помощь очень ценится, так как я полностью застрял.

+0

Мы можем объединить данные и назначить тип 3, и сюжет как один ggplot, или мы можем использовать 'cowplot' пакет, чтобы построить 2 ggplots бок о бок, yaxis выровнены. – zx8754

ответ

3

Как насчет добавления первого добавления некоторых новых переменных каждого набора данных, а затем объединить их:

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) 

Plot 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) 

Plot 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) 

Plot 03 - Facets

+0

Хороший ответ! Похоже на решение этой проблемы и дополнительную благодарность за то, что я показал функциональность «facet». –