首页 > 解决方案 > 我可以在 R 中的 ggplot 中分隔两个填充图例吗?

问题描述

我有一个数据集,我试图在 R 中使用 ggplot2 绘制,我想以两种不同的方式使用填充美学两次(一个变量是/否,另一个变量缩放)。

一个示例数据集:

df <- data.frame(Season = rep(c('a', 'b', 'c', 'd'), times = 3), 
                 Scenario = rep(c('S1', 'S2', 'S3'), each = 4),
                 meanA = rep(1, 12), meanB = rep(2,12))

我想要点为meanA被填充和点为meanB空。Scenario我希望这两组的颜色都可以缩放,我也希望填充meanA可以缩放Scenario。我已经设法以我希望的方式获得图表:

ggplot(df, aes(Season, meanA)) +
  geom_point(aes(color = Scenario, fill = Scenario), shape = 24,
             position = position_dodge(width = 0.4)) +
  geom_point(aes(y = meanB, color = Scenario), fill = NA, shape = 25,
             position = position_dodge(width = 0.4)) +
  ylim(0,3)

示例图

但是,我遇到的问题是我想要两个图例:一个具有两种形状(填充三角形,空三角形),另一个具有按场景缩放的填充/颜色。截至目前,该图只有一个图例,其中填充符号和未填充符号重叠。我怎样才能让图例看起来像我想要的那样?

标签: rggplot2

解决方案


通过一些重塑和guides功能,您可以到达那里:

library(tidyr)
library(dplyr)
library(ggplot2)
df <- data.frame(Season = rep(c('a', 'b', 'c', 'd'), times = 3), 
                 Scenario = rep(c('S1', 'S2', 'S3'), each = 4),
                 meanA = rep(1, 12), meanB = rep(2,12))

df2 <- df %>% 
  pivot_longer(
    meanA:meanB, names_to = "var", values_to = "val"
  )

ggplot(df2, aes(Season, val, shape = var, color = Scenario)) +
  geom_point(data = . %>% filter(var == "meanA"), aes(fill = Scenario),
             position = position_dodge(width = 0.4)) +
  geom_point(data = . %>% filter(var == "meanB"), aes(fill = NULL),
             position = position_dodge(width = 0.4)) +
  scale_shape_manual(values = c(24, 25)) +
  guides(
    shape = guide_legend(override.aes = list(fill = c("#F8766D", NA)))
  ) +
  ylim(0,3)

推荐阅读