r - 如何避免ggplot2中的图例类型重叠
问题描述
这是我的 dput 格式的数据:
structure(list(group = c("Females", "Females", "Females", "Females",
"Females", "Males", "Males", "Males", "Males", "Males"), x = c("age1",
"age2", "age3", "age4", "age5", "age1", "age2", "age3", "age4",
"age5"), Number = c(15.39484, 26.75518, 60.356684, 96.35884,
125.212368, 15.717276, 23.479224, 41.24258, 56.911816, 66.10272
), Rate = c(12.81679, 22.41374, 49.219, 82.78327, 120.2018, 12.42771,
19.17676, 33.32468, 48.22219, 62.51091)), class = "data.frame", row.names = c(NA,
-10L))
我绘制了按性别叠加折线图的条形图。这是我的代码:
library(tidyverse)
p1 <- ggplot(data) +
geom_bar(aes(x = x, y = Number, fill = group),
stat="identity", position = position_dodge(width = 0.9)) +
geom_line(aes(x = x, y = Rate, group = group, color = group)) +
scale_fill_manual(values = c("#fab79c", "#9fadd5")) +
scale_color_manual(values = c("#b20738", "#00549e"))
可以看出,条形图和折线图的图例是叠加在一起的。我希望将这两个几何图形的图例分开如下:
我在这里找到了一个类似的 stackoverflow 帖子,它建议将数据从宽格式转换为长格式。我尝试使用以下代码:
data2 <- data %>%
pivot_longer(cols = Number:Rate,
names_to = "outcome",
values_to = "val")
p2 <- ggplot() +
geom_bar(data = data2 %>% filter(outcome == "Number"),
aes(x = x, y = val, fill = group),
stat = "identity", position = position_dodge(width = 0.9)) +
geom_line(data = data2 %>% filter(outcome == "Rate"),
aes(x = x, y = val, group = group, color = group)) +
scale_fill_manual(values = c("#fab79c", "#9fadd5")) +
scale_color_manual(values = c("#b20738", "#00549e"))
然而,传说仍然是叠加的。
请问有什么办法可以分开传说吗?谢谢你。
解决方案
只需添加一列“group2”,指定要为线条着色的组:
data <- structure(list(group = c("Females", "Females", "Females", "Females",
"Females", "Males", "Males", "Males", "Males", "Males"), x = c("age1",
"age2", "age3", "age4", "age5", "age1", "age2", "age3", "age4",
"age5"), Number = c(15.39484, 26.75518, 60.356684, 96.35884,
125.212368, 15.717276, 23.479224, 41.24258, 56.911816, 66.10272
), Rate = c(12.81679, 22.41374, 49.219, 82.78327, 120.2018, 12.42771,
19.17676, 33.32468, 48.22219, 62.51091)), class = "data.frame", row.names = c(NA,
-10L))
data$group2 <- c(rep('Females (number of deaths)', 5), rep('Males (number of deaths)', 5))
library(ggplot2)
p1 <- ggplot(data) +
geom_bar(aes(x = x, y = Number, fill = group),
stat="identity", position = position_dodge(width = 0.9)) +
geom_line(aes(x = x, y = Rate, group = group2, color = group2)) +
scale_fill_manual(values = c("#fab79c", "#9fadd5")) +
scale_color_manual(values = c("#b20738", "#00549e"))
> data
group x Number Rate group2
1 Females age1 15.39484 12.81679 Females (number of deaths)
2 Females age2 26.75518 22.41374 Females (number of deaths)
3 Females age3 60.35668 49.21900 Females (number of deaths)
4 Females age4 96.35884 82.78327 Females (number of deaths)
5 Females age5 125.21237 120.20180 Females (number of deaths)
6 Males age1 15.71728 12.42771 Males (number of deaths)
7 Males age2 23.47922 19.17676 Males (number of deaths)
8 Males age3 41.24258 33.32468 Males (number of deaths)
9 Males age4 56.91182 48.22219 Males (number of deaths)
10 Males age5 66.10272 62.51091 Males (number of deaths)
> p1
现在删除图例的名称和它们之间的间距。
p1 <- ggplot(data) +
geom_bar(aes(x = x, y = Number, fill = group),
stat="identity", position = position_dodge(width = 0.9)) +
geom_line(aes(x = x, y = Rate, group = group2, color = group2)) +
scale_fill_manual(values = c("#fab79c", "#9fadd5")) +
scale_color_manual(values = c("#b20738", "#00549e")) +
theme(legend.title = element_blank(),
legend.margin = margin(-8,0,-8,0))
> p1
你只需要玩一点边距功能就可以实现你想要的。
推荐阅读
- node.js - IBM Cloud Functions:在 Nodejs 中使用异步调用
- python - ValueError:使用序列设置数组元素。在使用 scikit-learn 中的 SelectKBest 时
- javascript - 使用带护照 js 的第三方登录时重定向到上一页
- python - 如何从嵌套列表中删除所有零?
- yup - 如何使用 Yup 和 RHF 创建多个密码检查验证?
- ios - Swift 5 解析多级 JSON
- amazon-web-services - 多个 CNAME 会导致 ERR_TOO_MANY_REDIRECTS
- javascript - 拖放后如何保存新的html位置?
- javascript - 在执行将字母转换为莫尔斯电码的 javaScript 函数之前,如何断言用户输入包含在数组中(正确)
- php - Laravel如何从表单中获取选定的id并实时更新表单