r - 如何将图例添加到具有多个组的 ggplot 中,这些组在数据框中具有多列数据
问题描述
我有一个包含 4 组数据的 60x13 数据框,1 列是 1-60 个月的时间,1 列是时间点 n 的中值,2 是时间点 n 的可信间隔。我想生成一个图,其中中位数为实线,置信区间为虚线,我已经能够通过将每列添加为它自己的 geom_line 并通过匹配中位数的颜色手动分组来做到这一点以及它们相应的可信区间,但是,我无法添加图例。任何帮助将不胜感激。
ggplot(data=data1,
aes(x=month)) +
xlab("Month") +
ylab("Hazard Ratio") +
theme(plot.title = element_text(hjust = 0.5)) +
geom_line(aes(y=median),
color = "#4682B4",
size = 1) +
geom_line(aes(y=ucrd),
color = "#4682B4",
linetype=2,
size = 0.9,
alpha=0.5) +
geom_line(aes(y=lcrd),
color = "#4682B4",
linetype=2,
size = 0.9,
alpha=0.5) +
geom_line(aes(y=median.1),
color = "#4BB446",
size = 1) +
geom_line(aes(y=ucrd.1),
color = "#4BB446",
linetype=2,
size = 0.9,
alpha=0.5) +
geom_line(aes(y=lcrd.1),
color = "#4BB446",
linetype=2,
size = 0.9,
alpha=0.5) +
geom_line(aes(y=median.2),
color = "#AF46B4",
size = 1) +
geom_line(aes(y=ucrd.2),
color = "#AF46B4",
linetype=2,
size = 0.9,
alpha=0.5) +
geom_line(aes(y=lcrd.2),
color = "#AF46B4",
linetype=2,
size = 0.9,
alpha=0.5) +
geom_line(aes(y=median.3),
color = "#B47846",
size = 1) +
geom_line(aes(y=ucrd.3),
color = "#B47846",
linetype=2,
size = 0.9,
alpha=0.5) +
geom_line(aes(y=lcrd.3),
color = "#B47846",
linetype=2,
size = 0.9,
alpha=0.5)
scale_color_manual(name= "Treament",
values=c("4682B4", "4BB446", "AF46B4", "B47846"),
labels=c("a",
"b",
"c",
"d"
))
解决方案
这听起来很像数据形状问题。由于没有提供数据,这里是一个带有虚拟数据的示例。首先,我们生成一些大致与您在文本中提到的形状相同的数据。
library(tidyr)
library(ggplot2)
n <- 60
df <- data.frame(
time = seq_len(n),
group1_median = rnorm(n),
group1_low = rnorm(n, -2),
group1_high = rnorm(n, 2),
group2_median = rnorm(n),
group2_low = rnorm(n, -2),
group2_high = rnorm(n, 2),
group3_median = rnorm(n),
group3_low = rnorm(n, -2),
group3_high = rnorm(n, 2),
group4_median = rnorm(n),
group4_low = rnorm(n, -2),
group4_high = rnorm(n, 2)
)
现在,我们将把它从宽格式重塑为长格式。下面的函数究竟应该是什么样子,很大程度上取决于数据的列名。我选择虚拟数据列名称非常简单。
df <- pivot_longer(
df, -time,
names_to = c("group", "metric"),
names_sep = "_"
)
因为median
,low
和high
现在被视为单独的观察,我们需要再次重塑数据以使其稍微宽一些。
df <- pivot_wider(
df, names_from = "metric"
)
然后将其放入 ggplot2 中的形状相当不错,图例将自行整理。
ggplot(df, aes(time, colour = group)) +
geom_line(aes(y = median)) +
geom_ribbon(aes(ymin = low, ymax = high),
linetype = 2, fill = NA)
如果有人有更合适的重塑策略,我很想听听他们,因为我还在学习正确的旋转。
推荐阅读
- gspread - gspread 可以创建/操作图表吗?
- python - 关于在 Apache Beam for python 中过滤返回值和预期返回类型的问题
- python - 识别列表中没有匹配词的句子
- floating-point - MIPS:浮点数
- sql - Microsoft SQL Server - 获取最新的价值记录
- php - 返回 Json_Encode 内容并以 HTML 显示
- python - Python OpenCV Lane Detector“无法解压不可迭代的numpy.uint8对象”错误
- python - 根据唯一 ID 将数据从 1 个数据集复制到另一个数据集
- c++ - 在优化代码中查找我的课程副本的位置有什么好的技术?
- sql - Maximo:使用 SQL 查询模拟工作流分配