You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot中合并填充与颜色图例并设置为2×2布局?

问题:将ggplot多类型图层的图例整合为2×2布局

我查找了一些类似问题,但均不符合我的实际需求。我有4个数据列需要可视化,其中3列绘制成折线(geom_line),1列绘制成面积图(geom_area)。我希望将生成图表的图例整理为整齐的2行2列布局,但始终无法实现。示例代码如下:

library(tidyverse)

# 随机数据
data <- tibble(X=1:50,
               A=sample(seq(5, 6, 0.1), 50, replace = TRUE),
               B=sample(seq(4, 5, 0.1), 50, replace = TRUE),
               C=sample(seq(3, 4, 0.1), 50, replace = TRUE),
               D=sample(seq(1, 3, 0.5), 50, replace = TRUE))

ggplot(data, aes(x=X)) + 
  geom_area(aes(y=D, fill='Dataset4'), alpha=0.5) + 
  geom_line(aes(y=A, color='Dataset1')) +
  geom_line(aes(y=B, color='Dataset2')) +
  geom_line(aes(y=C, color='Dataset3')) +
  ylab("")+
  guides(fill=guide_legend(nrow=2, order=2),
         color=guide_legend(nrow=2, order=1))

当前生成的图例分为两组,我期望将四个图例条目整合为2×2的排列方式,请问该需求是否可实现?


解决方案:统一图例美学映射并调整布局

可以实现,核心是把原本分属fill和color的两个图例合并为一个,通过以下步骤完成:

  1. 将数据转换为长格式:这是ggplot处理多列数据的标准方式,便于统一映射美学属性。
  2. 使用单一的图例映射:用color作为主映射,然后通过override.aes为面积图条目单独设置填充样式。
  3. 设置图例为2行2列布局:在guides中指定nrow=2。

修改后的代码如下:

library(tidyverse)

# 随机数据
data <- tibble(X=1:50,
               A=sample(seq(5, 6, 0.1), 50, replace = TRUE),
               B=sample(seq(4, 5, 0.1), 50, replace = TRUE),
               C=sample(seq(3, 4, 0.1), 50, replace = TRUE),
               D=sample(seq(1, 3, 0.5), 50, replace = TRUE))

# 转换为长格式
data_long <- data %>% 
  pivot_longer(cols = -X, names_to = "Dataset", values_to = "Value") %>% 
  mutate(Dataset = case_when(
    Dataset == "A" ~ "Dataset1",
    Dataset == "B" ~ "Dataset2",
    Dataset == "C" ~ "Dataset3",
    Dataset == "D" ~ "Dataset4"
  ))

ggplot(data_long, aes(x = X, y = Value, color = Dataset)) +
  # 绘制面积图,仅针对Dataset4
  geom_area(data = filter(data_long, Dataset == "Dataset4"), 
            aes(fill = Dataset), alpha = 0.5, color = NA) +
  # 绘制折线图,针对其余数据集
  geom_line(data = filter(data_long, Dataset != "Dataset4")) +
  ylab("") +
  # 合并图例并设置2行2列
  guides(color = guide_legend(nrow = 2, 
                              override.aes = list(
                                # 为Dataset4设置填充样式,隐藏线条
                                fill = scales::hue_pal()(4)[4],
                                color = NA,
                                # 为其他数据集设置线条样式,隐藏填充
                                alpha = c(1,1,1,0.5)
                              ))) +
  # 统一填充和颜色的图例标题(确保一致)
  labs(color = "Datasets", fill = "Datasets")

代码说明:

  • pivot_longer把宽格式数据转为长格式,方便统一处理每个数据集的映射。
  • 分别绘制面积图和折线图,通过data参数筛选对应的数据。
  • override.aes用来调整图例条目的显示样式:给Dataset4设置填充色并隐藏线条,给其他数据集保留线条并隐藏填充。
  • guide_legend(nrow=2)直接将合并后的图例设置为2行2列布局。

内容的提问来源于stack exchange,提问作者polypus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:19:01