使用ggplot2在两条线之间填充颜色区域

3

我想要给分组线之间的区域着色。我尝试了不同的方法,但却无法做到。

df <- data.frame(year = rep(c(1950:1955), each = 2),
                 gender = factor(rep(c("male", "female"), times = 6)),
                 value = c(40526812, 37450509, 43027405,
                            40135682, 45801088, 43130369,
                            48579427, 46077640, 50948574,
                            48493786, 53052094, 50537984))

df |> 
  ggplot(aes(year, value, group = gender)) +
  geom_line()

在这里输入图片描述

提前致谢!


2
这个回答解决了你的问题吗?使用ggplot在两条线之间填充区域 - Adam Quek
2个回答

4
您可以使用pivot_wider来定义区域的边界,以创建geom_ribbon中区域的ymaxymin,从而无需按参数进行子集处理。因此,更容易复制。这里是一个示例:
df <- data.frame(year = rep(c(1950:1955), each = 2),
                 gender = factor(rep(c("male", "female"), times = 6)),
                 value = c(40526812, 37450509, 43027405,
                           40135682, 45801088, 43130369,
                           48579427, 46077640, 50948574,
                           48493786, 53052094, 50537984))

library(ggplot2)
library(dplyr)
library(tidyr)
area <- df %>%
  pivot_wider(names_from = gender, values_from = value) %>%
  mutate(
    ymax = pmax(male, female),
    ymin = pmin(male, female)
  )

ggplot(data = df, mapping = aes(year, y = value, group = gender)) +
  geom_line() +
  geom_ribbon(data = area, mapping = aes(year, ymin = ymin, ymax = ymax), alpha = 0.4, inherit.aes = FALSE ) 

这段内容是由reprex包 (v2.0.1)在2022年7月22日创建的。


2
我觉得这个解决方案很棒。谢谢!! - PabloAB
inherit.aes是什么作用?我从未使用过它。 - PabloAB
2
当inherit.aes为FALSE时,它会覆盖默认的美学设置而不是将它们合并。这很有用,因为在这种情况下我们使用了两个数据框,所以我们可以定义数据和美学,使其不继承行为。 - Quinten

3
您可以使用geom_ribbon,它允许在轴值范围内进行区域着色。
增加alpha值会增强着色器的强度。
  ggplot(data=df, aes(year, value, group = gender)) +
  geom_line() + 
  geom_ribbon(data=subset(df, 1950 <= year & year <= 1955), 
              aes(ymin=rep(subset(df, gender=='female')$value, each=2), 
                  ymax=rep(subset(df, gender=='male')$value, each=2)), fill="blue", alpha=0.5)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接