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

ggplot selecting parts of data as y variable or confidence interval

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

示例代码:

library(reshape2)
library(ggplot2)

demo <- data.frame(cbind(
            ID = c(1:10),
            X = c(5.00, 1.03, 1.26, 2.03, 0.99, 4.24, 5.00, 5.00, 2.83, 5.00),
            Y1 = c(0.17, 0.84, 0.79, 0.59, 0.85, 0.22, 0.17, 0.17, 0.40, 0.17),
            Y1_lci = c(0.16, 0.81, 0.76, 0.56, 0.82, 0.22, 0.16, 0.16, 0.39, 0.16),
            Y1_uci = c(0.18, 0.87, 0.82, 0.61, 0.88, 0.23, 0.18, 0.18, 0.41, 0.18),
            Y2 = c(0.14, 0.85, 0.80, 0.59, 0.86, 0.20, 0.14, 0.14, 0.38, 0.14),
            Y2_lci = c(0.11, 0.83, 0.77, 0.54, 0.84, 0.16, 0.11, 0.11, 0.33, 0.11),
            Y2_uci = c(0.19, 0.88, 0.83, 0.64, 0.88, 0.25, 0.19, 0.19, 0.44, 0.19)))

demo.melt <- melt(demo, id.vars=c("ID", "X"), value.name="value", variable.name="var")

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

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

...但是 CI 数据不在对象中,我 t/don 不知道如何使用 geom_ribbon() 绘制它。所以我的问题是如何将我的 Y1 和 Y2 绘制为线,并将 lci 和 uci 数据绘制为同一 time/from 同一对象的阴影区域的边界??

当第一个数据集中的所有内容都作为列时,为什么要融化数据?尝试稍微修改一下 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 更改为 grid.arrange 内的 nrow

如果您想包含图例(在这种情况下,它是 "manually" 创建的,而在其他数据格式中您更容易获得)。

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

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

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)

这也让你可以分面

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