ggplot选择数据部分作为y变量或置信区间

时间:2015-08-09 14:57:53

标签: r ggplot2 confidence-interval

我从另一个程序的复杂分析中获取数据,我想用R绘制。我有一个X变量和多个Y变量以及预测的置信限。我希望用Y和X的格式在R中用阴影置信区间绘制它们。我知道我可以将ggplot子集化为仅显示主要效果 - 我也知道如何ggplot阴影区域 - 但我无法弄清楚如何在同一数据帧中同时进行这两种操作。

示例代码:

ggplot(demo.melt, aes(x=X, y=value, group=var, col=var)) + geom_line()

现在我可以将它们全部绘制成这样的行:

demo.sub <- demo.melt[demo.melt$var %in% c("Y1", "Y2"),]
ggplot(demo.sub, aes(x=X, y=value, group=var, col=var)) + geom_line()

......但那不是我想要的。或者,我可以仅将主要响应变量子集化:

select * from tblData where details not like '%## ??/??/???? ##%'

...但是然后CI数据不在对象中,我不能/不知道如何使用geom_ribbon()来绘制它。所以我的问题是如何绘制我的Y1&amp; Y2为线,lci&amp; uci数据作为阴影区域的边界同时/来自同一个对象??

2 个答案:

答案 0 :(得分:2)

当第一个数据集中的所有内容都作为列时,为什么要融化数据?只是尝试稍微修改ggplot代码:

ggplot(demo, aes(x=X)) + 
  geom_line(aes(y=Y1), color="red") +
  geom_line(aes(y=Y2), col="blue") +
  geom_ribbon(aes(ymin=Y1_lci, ymax=Y1_uci), color="red", alpha=0.2)+
  geom_ribbon(aes(ymin=Y2_lci, ymax=Y2_uci), color="blue", alpha=0.2)

如果你做了3列以上的话,这可能看起来很难看。 因此,您可能更喜欢这个版本并排绘制:

library(gridExtra)

plot1=
ggplot(demo, aes(x=X)) + 
  geom_line(aes(y=Y1), color="red") +
  geom_ribbon(aes(ymin=Y1_lci, ymax=Y1_uci), alpha=0.2)

plot2=
ggplot(demo, aes(x=X)) + 
  geom_line(aes(y=Y2), col="blue") +
  geom_ribbon(aes(ymin=Y2_lci, ymax=Y2_uci), alpha=0.2)


grid.arrange(plot1, plot2, ncol=2)

另外,如果ncol看起来更好,请将nrow更改为grid.arrange

如果您想要包含一个图例(在这种情况下,它是&#34;手动&#34;在使用其他数据格式时创建它更容易)。

   ggplot(demo, aes(x=X)) + 
  geom_line(aes(y=Y1, color="Y1")) +
  geom_line(aes(y=Y2, color="Y2")) +
  labs(title="TITLE", x="X_name", y="Y_name", col="Y")+
  scale_colour_manual(values=c("red","blue"))+
  geom_ribbon(aes(ymin=Y1_lci, ymax=Y1_uci), col="red", alpha=0.2)+
  geom_ribbon(aes(ymin=Y2_lci, ymax=Y2_uci), col="blue", alpha=0.2)

创造传奇可能有更好的方法,但我一直在使用它。

使用线型:

ggplot(demo, aes(x=X)) + 
  geom_line(aes(y=Y1, linetype="Y1")) +
  geom_line(aes(y=Y2, linetype="Y2")) +
  labs(title="TITLE", x="X_name", y="Y_name", linetype="Y")

答案 1 :(得分:1)

您可以使用melt / reshape执行此操作,如果您想轻松生成图例,这非常有用。使用varying的{​​{1}}参数将相关变量组合在一起。

reshape

然后绘制

demo_m <-  reshape(demo, idvar=c("ID","X"), 
                         varying=list(c(3,6), c(4,7), c(5,8)), 
                         direction="long", 
                         v.names=c("Y", "lci", "uci"))

这也允许你进行分面

ggplot(demo_m, aes(X, Y, ymin=lci, ymax=uci, col=factor(time))) + 
              geom_line() + 
              geom_ribbon(alpha=0.2)