ggplot2 不会将图例添加到具有多个层的箱线图

Posted

技术标签:

【中文标题】ggplot2 不会将图例添加到具有多个层的箱线图【英文标题】:ggplot2 won't add legend to boxplot with multiple strata 【发布时间】:2020-06-16 02:23:00 【问题描述】:

我正在尝试使用此示例数据向我的箱线图添加图例

    BM  math  loginc
    1    2     1.4523
    0    3     2.3415
    1    1     0.6524
    1    3     2.4562
    0    1     3.5231
    0    2     2.4532

本质上,我有两个组 BM = 0 和 BM = 1,每个组中有 3 个类别(数学 = 1、2 或 3),并且值为 loginc。

boxcolors=c('gray70','orange','red','gray70','orange','red')

bothboxplot=ggplot(both, aes(x=math,y=loginc))+
  geom_boxplot(fill=boxcolors)+
  stat_summary(fun.y=mean,color=line,geom = "point",shape=3,size=2)+
  scale_x_discrete(name='Site Category')+
  scale_y_continuous(name='Log(Incidence/100,000)')+
  facet_grid(.~BM)

  bothboxplot

这会产生以下情节:

除了缺少传说之外,这个情节完全正确。我玩过 aes() 的位置,但它不起作用。当 aes() 被放置在 ggplot() 而不是 geom_plot() 中时,我的填充语句给出了错误(“错误:美学必须是长度 1 或与数据相同(187):填充”。

理想情况下,我想要的图例应包含 1、2、3 数学类别的名称、它们对应的颜色以及每个框中的 (+) 符号以标记为“平均值”。

【问题讨论】:

【参考方案1】:

关键是您不要将变量映射到填充美学,即在fill 上映射math 并使用scale_fill_manual 手动设置填充颜色:

library(ggplot2)

both <- data.frame(
  BM = sample(0:1, 100, replace = TRUE),
  math = sample(1:3, 100, replace = TRUE),
  loginc = runif(100)
)

bothboxplot <- ggplot(both, aes(factor(math), loginc, fill = factor(math))) +
  geom_boxplot() +
  stat_summary(fun = mean, geom = "point", shape = 3, size = 2) +
  scale_fill_manual(values = c("gray70", "orange", "red")) +
  scale_x_discrete(name = "Site Category") +
  scale_y_continuous(name = "Log(Incidence/100,000)") +
  facet_grid(. ~ BM)

bothboxplot

【讨论】:

【参考方案2】:

您需要将fill 的列传递给审美:

df <- 
  tibble(
    loginc = rnorm(n = 12, mean = 0, sd = 1),
    BM = rep(c(0, 1), each = 6),
    math = rep(1:3, 4)
  ) %>% 
  mutate(math = factor(math))

df %>% 
  ggplot(aes(x = math, y = loginc, group = math, fill = math)) +
  geom_boxplot() +
  stat_summary(fun.y = mean, geom = "point", shape=3, size=2) +
  facet_grid(~ BM)

【讨论】:

也许用 boxcolors=c('gray70','orange','red')scale_fill_manual(values = boxcolors) 来获得 OP 的自定义颜色。

以上是关于ggplot2 不会将图例添加到具有多个层的箱线图的主要内容,如果未能解决你的问题,请参考以下文章

在ggplot2中绘制两个具有相同y变量但不同x变量的箱线图

如何在具有多个组的箱线图顶部创建单独的线

使用ggplot2画基因表达样本的箱线图

R语言ggplot2可视化在lines线图的尾端添加线图标签并且去除图例实战

如何从 ggplot 中的箱线图中删除图例? [复制]

ggplot2 按第 80 个百分位重新排列我的箱线图