在同一张图上绘制两组时使用 ggplot2 geom_bar() 获取正确填充颜色的问题

Issues with getting correct fill color using ggplot2 geom_bar() when plotting two groups on the same graph

我在 ggplot2 中遇到 geom_bar() 问题,其中条形颜色未根据数据点所属的组正确设置,而是较高的数据点始终是一种颜色, 下方总是另一种颜色。

假设我有两个组,黑色组和蓝色组。我想绘制该组成员吃的比萨饼数量的分布图。所以,我有一个 table,其中列出了每个比萨饼的数量,该组中吃掉该数量的所有人的百分比。

当我使用 geom_point() 绘制此图时,所有内容都正确着色。

然而,当我使用 geom_bar() 绘制它时,出于某种原因,较大的条形图始终为黑色,即使它应该是蓝色。我对这里出了什么问题感到非常困惑——如何让条形图显示正确的颜色?下面是示例数据和重现我的问题的代码,以及我正在谈论的两个图表的图片。

library(ggplot2)

data = data.frame(structure(list(pizzas = c(0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 
                                             6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12), color = c("black", 
                                                                                                        "blue", "black", "blue", "black", "blue", "black", "blue", "black", 
                                                                                                        "blue", "black", "blue", "black", "blue", "black", "blue", "black", 
                                                                                                        "blue", "black", "blue", "black", "blue", "black", "blue", "black", 
                                                                                                        "blue"), value = c(0.346153846153846, 0.234042553191489, 0.153846153846154, 
                                                                                                                           0.148936170212766, 0.115384615384615, 0.106382978723404, 0.153846153846154, 
                                                                                                                           0.127659574468085, 0.0192307692307692, 0.0638297872340425, 0.0576923076923077, 
                                                                                                                           0.127659574468085, 0.0576923076923077, 0.0851063829787234, 0.0384615384615385, 
                                                                                                                           0.0425531914893617, 0.0384615384615385, 0, 0, 0, 0, 0, 0, 0.0425531914893617, 
                                                                                                                           0.0192307692307692, 0.0212765957446809)), row.names = c(NA, -26L
                                                                                                                           ), class = c("tbl_df", "tbl", "data.frame")))

#This colors things correctly
ggplot(data=data, aes(x = pizzas, y=value, color = color)) +
  scale_color_manual(values=c('black', 'blue')) +
  geom_point(size=3) +
  ylab("Percent frequency") +
  xlab("Number pizzas eaten")

#This colors things incorrectly, with the higher bar always being black
ggplot(data=data, aes(x = pizzas, y=value, fill = color)) +
  scale_fill_manual(values=c('black', 'blue')) +
  geom_bar(alpha=.5, stat='identity') +
  ylab("Percent frequency") +
  xlab("Number pizzas eaten")

这是使用 geom_point 的情节的样子 -- 东西的颜色正确: 这就是使用 geom_bar 时的情节——出于某种原因,较高的条总是黑色的!

你的第二个图其实是在做一个堆积条形图,所以蓝色部分是蓝色的值,上面的黑色部分是黑色部分,总高度是总和。我不确定您的意图是什么,但也许您想并排显示蓝色和黑色的值?如果是这样,您可以在代码中使用 position = "dodge" 完成此操作,如下所示。

ggplot(data=data, aes(x = pizzas, y=value, fill = color)) +
  scale_fill_manual(values=c('black', 'blue')) +
  geom_bar(alpha=.5, stat='identity', position = "dodge") +
  ylab("Percent frequency") +
  xlab("Number pizzas eaten")

更新:问题是 geom_bar() 默认堆叠条形图,我需要设置一个位置参数来阻止这种行为...

解决方案是

ggplot(data=data, aes(x = pizzas, y=value, fill = color)) +
  scale_fill_manual(values=c('black', 'blue')) +
  geom_bar(alpha=.5, stat='identity', position = "dodge") +
  ylab("Percent frequency") +
  xlab("Number pizzas eaten")

给出:

否则,如果我希望使用 position_dodge() 的宽度参数将它们逐字重叠在一起:

ggplot(data=data, aes(x = pizzas, y=value, fill = color)) +
  scale_fill_manual(values=c('black', 'blue')) +
  geom_bar(alpha=.5, stat='identity', position = position_dodge(width=0)) +
  ylab("Percent frequency") +
  xlab("Number pizzas eaten")

给出: