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
执行此操作,如果您想轻松生成图例,这将非常有用。使用 reshape
的 varying
参数将相关变量组合在一起。
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 ~ .)
我有从另一个程序中的一些复杂分析中获取的数据,我想使用 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
执行此操作,如果您想轻松生成图例,这将非常有用。使用 reshape
的 varying
参数将相关变量组合在一起。
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 ~ .)