首页 > 解决方案 > 如何避免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")) 

然而,传说仍然是叠加的。

请问有什么办法可以分开传说吗?谢谢你。

标签: rggplot2legend

解决方案


只需添加一列“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

情节2

你只需要玩一点边距功能就可以实现你想要的。


推荐阅读