Color/fill 柱 geom_col 基于另一个变量?

Color/fill bars in geom_col based on another variable?

我有一个未着色的 geom_col,希望它通过在条形中显示不同深浅的颜色来显示有关 另一个(连续)变量的信息。

例子

以 geom_col

开头
library(dplyr)
library(ggplot2)

set.seed(124)
iris[sample(1:150, 50), ] %>% 
  group_by(Species) %>% 
  summarise(n=n()) %>% 
  ggplot(aes(Species, n)) + 
  geom_col()

假设我们要根据每个分组low/high mean(Sepal.Width) 的方式给条形图着色

(注意:我不知道是否有办法为 ggplot 提供 'continuous' 颜色,但如果没有,可以使用以下颜色)

library(RColorBrewer)
display.brewer.pal(n = 3, name= "PuBu")
brewer.pal(n = 3, name = "PuBu")
[1] "#ECE7F2" "#A6BDDB" "#2B8CBE"

最终结果应该与上面的 geom_col 相同,但条形图的颜色根据 low/high mean(Sepal.Width) 的颜色而定。

备注

我试过的

我认为这会起作用,但它似乎忽略了我提供的颜色

library(RColorBrewer)

# fill info from: 
set.seed(124)
iris[sample(1:150, 50), ] %>% 
  group_by(Species) %>% 
  summarise(n=n(), sep_mean = mean(Sepal.Width)) %>% 
  arrange(desc(n)) %>% 
  mutate(colors = brewer.pal(n = 3, name = "PuBu")) %>% 
  mutate(Species=factor(Species, levels=Species)) %>% 
  ggplot(aes(Species, n, fill = colors)) + 
  geom_col()

执行以下操作

  • fill = sep_mean 添加到 aes()
  • 添加+ scale_fill_gradient()
  • 删除 mutate(colors = brewer.pal(n = 3, name = "PuBu")) 因为上一步已经为您处理了颜色
set.seed(124)

iris[sample(1:150, 50), ] %>% 
  group_by(Species) %>% 
  summarise(n=n(), sep_mean = mean(Sepal.Width)) %>%
  arrange(desc(n)) %>% 
  mutate(Species=factor(Species, levels=Species)) %>% 
  ggplot(aes(Species, n, fill = sep_mean, label=sprintf("%.2f", sep_mean))) + 
  geom_col() +
  scale_fill_gradient() +
  labs(fill="Sepal Width\n(mean cm)") +
  geom_text()