r - ggplot:如何在由几个 geom_ribbon() 和 geom_line() 组成的图中添加图例?
问题描述
问题:如何为这个特定的情节添加图例?
我有
图例应包括:
nd$y_fem
- 蓝线 - 应该是legend
“5 年死亡概率”
nd$y_tre
- 红线 - 应legend
为“3 年死亡概率”
nd$y_et
- 绿线 - 应legend
为“1 年死亡概率”
最好,legend
应该包括 theline
和 the fill
。
如何才能做到这一点?
ggplot(nd, aes(x=n_fjernet)) +
geom_ribbon(aes(ymin = y_tre, ymax = y_fem), alpha = .15, fill="#2C77BF") +
geom_line(aes(y=y_fem), size=3, color="white") +
geom_line(aes(y=y_fem), color="#2C77BF", size=.85) +
geom_ribbon(aes(ymin = y_et, ymax = y_tre), alpha = .15, fill="#E38072") +
geom_line(aes(y=y_tre), size=3, color="white") +
geom_line(aes(y=y_tre), color="#E38072", size=.85) +
geom_ribbon(aes(ymin = 0, ymax = y_et), alpha = .15, fill="#6DBCC3") +
geom_line(aes(y=y_et), size=3, color="white") +
geom_line(aes(y=y_et), color="#6DBCC3", size=.85) +
scale_x_continuous(breaks = seq(0,10,2), limits=c(0,10))
我的数据
nd <- structure(list(y_et = c(0.473, 0.473, 0.472, 0.471, 0.471, 0.47,
0.47, 0.469, 0.468, 0.468, 0.467, 0.467, 0.466, 0.465, 0.465,
0.464, 0.464, 0.463, 0.462, 0.462, 0.461, 0.461, 0.46, 0.459,
0.459, 0.458, 0.458, 0.457, 0.456, 0.456, 0.455, 0.455, 0.454,
0.453, 0.453, 0.452, 0.452, 0.451, 0.45, 0.45, 0.449, 0.449,
0.448, 0.447, 0.447, 0.446, 0.446, 0.445, 0.445, 0.444, 0.443,
0.443, 0.442, 0.442, 0.441, 0.44, 0.44, 0.439, 0.439, 0.438,
0.438, 0.437, 0.436, 0.436, 0.435, 0.435, 0.434, 0.433, 0.433,
0.432, 0.432, 0.431, 0.431, 0.43, 0.429, 0.429, 0.428, 0.428,
0.427, 0.427, 0.426, 0.425, 0.425, 0.424, 0.424, 0.423, 0.423,
0.422, 0.421, 0.421, 0.42, 0.42, 0.419, 0.419, 0.418, 0.417,
0.417, 0.416, 0.416, 0.415), y_tre = c(0.895, 0.894, 0.894, 0.893,
0.893, 0.893, 0.892, 0.892, 0.891, 0.891, 0.89, 0.89, 0.889,
0.889, 0.889, 0.888, 0.888, 0.887, 0.887, 0.886, 0.886, 0.886,
0.885, 0.885, 0.884, 0.884, 0.883, 0.883, 0.882, 0.882, 0.881,
0.881, 0.881, 0.88, 0.88, 0.879, 0.879, 0.878, 0.878, 0.877,
0.877, 0.876, 0.876, 0.875, 0.875, 0.875, 0.874, 0.874, 0.873,
0.873, 0.872, 0.872, 0.871, 0.871, 0.87, 0.87, 0.869, 0.869,
0.868, 0.868, 0.867, 0.867, 0.866, 0.866, 0.865, 0.865, 0.865,
0.864, 0.864, 0.863, 0.863, 0.862, 0.862, 0.861, 0.861, 0.86,
0.86, 0.859, 0.859, 0.858, 0.858, 0.857, 0.857, 0.856, 0.856,
0.855, 0.855, 0.854, 0.854, 0.853, 0.853, 0.852, 0.852, 0.851,
0.851, 0.85, 0.85, 0.849, 0.848, 0.848), y_fem = c(0.974, 0.974,
0.973, 0.973, 0.973, 0.973, 0.973, 0.973, 0.972, 0.972, 0.972,
0.972, 0.972, 0.971, 0.971, 0.971, 0.971, 0.971, 0.971, 0.97,
0.97, 0.97, 0.97, 0.97, 0.969, 0.969, 0.969, 0.969, 0.969, 0.968,
0.968, 0.968, 0.968, 0.968, 0.967, 0.967, 0.967, 0.967, 0.967,
0.966, 0.966, 0.966, 0.966, 0.966, 0.965, 0.965, 0.965, 0.965,
0.965, 0.964, 0.964, 0.964, 0.964, 0.963, 0.963, 0.963, 0.963,
0.963, 0.962, 0.962, 0.962, 0.962, 0.961, 0.961, 0.961, 0.961,
0.961, 0.96, 0.96, 0.96, 0.96, 0.959, 0.959, 0.959, 0.959, 0.958,
0.958, 0.958, 0.958, 0.957, 0.957, 0.957, 0.957, 0.957, 0.956,
0.956, 0.956, 0.956, 0.955, 0.955, 0.955, 0.955, 0.954, 0.954,
0.954, 0.954, 0.953, 0.953, 0.953, 0.952), n_fjernet = c(0, 0.1,
0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4,
1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4,
4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 5.1, 5.2, 5.3,
5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
6.7, 6.8, 6.9, 7, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9,
8, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9, 9.1, 9.2,
9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9)), row.names = c(NA, -100L), class = c("data.table",
"data.frame"))
解决方案
在ggplot
图例中是从您设置的比例生成的,以识别数据中的分组或值。您已经分别绘制了每个功能区和线条,因此没有将它们捆绑在一起的比例可以自动生成图例。
我明白你为什么这样做 - 你的变量都在不同的列中,而不是在单个列中的变量。这是最好将数据转换为长格式以进行绘图的场合之一,使用pivot_longer
from tidyr
。
为了简化数据整理,您可以使用堆积面积图,而不是使用功能区。这需要您修改输入数据,我们可以通过以下方式轻松完成mutate
:
library(dplyr)
library(tidyr)
library(ggplot2)
my_labels <- c("5 year probability of death",
"3 year probability of death",
"1 year probability of death")
df <- mutate(nd, y_fem = y_fem - y_tre, y_tre = y_tre - y_et) %>%
tidyr::pivot_longer(1:3) %>%
mutate(name = factor(name, levels = c("y_fem", "y_tre", "y_et")))
ggplot(df, aes(x=n_fjernet, y = value, colour = name, group = name)) +
geom_area(aes(fill = name), position = "stack", alpha = 0.15) +
geom_line(colour = "white", size = 3, position = "stack") +
geom_line(position = "stack") +
geom_point(position = "stack", data = df[c(1:3, -2:0 + nrow(df)), ]) +
scale_fill_manual(values = c("#2C77BF", "#E38072", "#6DBCC3"),
labels = my_labels) +
scale_colour_manual(values = c("#2C77BF", "#E38072", "#6DBCC3"),
labels = my_labels)
请注意,该图与示例一不同:提供的数据仅适用于该图的最左侧部分。
推荐阅读
- ios - Ionic 3 build --prod 仅在 iOS 上导致白屏
- jquery - 如何在以编程方式将文本添加到 Jquery 中的 html 元素后插入换行符?
- scala - Scalaz 7 如何将 Functor 与 Function1 一起使用
- javascript - 您如何垂直列出字符串输出并相应地编号?
- php - 为什么Controller Codeigniter中没有处理返回后的流程
- javascript - 如何修复“TypeError:app.use() 需要中间件函数”?
- python - 在 Keras 训练期间动态更改损失函数,无需重新编译优化器等其他模型属性
- vba - 如何从 excel 工作簿中获取价值以在 Web 表单保管箱中查找内容
- spring - 访问此资源需要 Spring OAuth2 完整身份验证
- javascript - 如何在 javascript 中访问该数组