在ggplot中为特定行着色
Posted
技术标签:
【中文标题】在ggplot中为特定行着色【英文标题】:Coloring a specific line in ggplot 【发布时间】:2022-01-12 13:59:42 【问题描述】:我使用 ggplot 绘制数百条模拟路径。数据已由 pivot_longer 组织,如下所示(200 条模拟路径,每条路径有 2520 个周期;首先是模拟 1,然后是模拟 2,依此类推,ind 显示每个周期的模拟值):
sim | period | ind |
---|---|---|
1 | 0 | 100.0 |
1 | 1 | 99.66 |
. | . | . |
1 | 2520 | 103.11 |
2 | 0 | 100.0 |
. | . | . |
. | . | . |
200 | 0 | 100.0 |
. | . | . |
200 | 2520 | 195.11 |
不确定使用 pivot_long 是否最佳,但至少以下 ggplot 看起来不错:
p<-ggplot(simdata, aes(x=period, y=ind,color=sim, group=sim))+geom_line()
用不同深浅的蓝色生成一个漂亮的图表。
我想做的是用不同的颜色(例如红色和绿色)为平均、中位数和四分位数路径着色。中位数、平均数和四分位数路径由上一周期的值定义。我已经知道这些的 sim 号码。例如。假设中间路径是 sim = 160 的路径。
我尝试了以下方法。
添加一个新的 geom_line 指定中间路径的编号(sim):
p + geom_line(aes(y = simdata[sim == 160,], color ="red")
这会失败,因为附加的 geom_line 与 simdata 的长度不同 (200*2520) - 即使图形的 x 轴只有 2520 个句点。
统计摘要
p + stat_summary(aes(group=sim),fun=median, geom="line",colour="red")
结果是所有行都被读取,模拟行也是如此。另外,我拒绝了这一点,因为让 ggplot 找到平均值、中位数等值需要更多时间,而不是在图形部分之前找到它们。
-
gghighlight
我尝试了这个包,但不知道你是否可以指定路径号来着色。
【问题讨论】:
也许您可能不想绘制 200 条线,而是只绘制汇总统计信息(例如,一条线表示您的平均值),然后添加误差带(例如使用 geom_ribbon) 【参考方案1】:也许尝试您的第一个解决方案,但将其传递给 geom_line
的 data
参数:
p + geom_line(data = simdata[simdata$sim == 160,], color ="red")
作为一些模拟数据的简单示例:
library(ggplot2)
df <- data.frame(a = rep(1:20, each = 100),
b = rep(1:100, times = 20),
c = rnorm(2000))
ggplot(df, aes(b, c, group = a)) +
geom_line(colour = "grey") +
geom_line(data = df[df$a==20,], colour = "red")
您还可以在aes
中将条件作为参数传递,它以scale_colour_manual
指定的颜色绘制一条线(更整洁,添加图例,带有可编辑的标签):
ggplot(df, aes(b, c, group = a, colour = a == 20)) +
geom_line() +
scale_colour_manual(values = c("TRUE" = "red", "FALSE" = "grey"))
由reprex package 创建于 2021-12-07 (v2.0.1)
【讨论】:
谢谢,这真的很有用!第一个选项还通过添加更多 geom_line 部分来支持多条不同颜色的线。以上是关于在ggplot中为特定行着色的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:使用R原生plot函数为指定曲线下面的区域着色ggplot2可视化在曲线的特定下方添加分割线ggplot2为指定曲线下面的区域着色
R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色在树状图dendrogram中为不同的层次聚类簇配置不同的色彩