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变量的箱线图