更改 ggplot 条形图填充颜色

Change ggplot bar chart fill colors

有了这个数据:

df <- data.frame(value =c(20, 50, 90), 
                 group = c(1, 2,3))

我可以得到条形图:

df %>% ggplot(aes(x = group, y = value, fill = value)) +
  geom_col() +
  coord_flip()+ 
  scale_fill_viridis_c(option = "C") +
  theme(legend.position = "none")

但我想让这些条的颜色根据它们在 value 中的相应值而变化。

我已经使用 geom_raster:

更改了它们
ggplot() + 
  geom_raster(aes(x = c(0:20), y = .9, fill = c(0:20)),  
              interpolate = TRUE) +
  geom_raster(aes(x = c(0:50), y = 2, fill = c(0:50)), 
              interpolate = TRUE) +
  geom_raster(aes(x = c(0:90), y = 3.1, fill = c(0:90)),               
              interpolate = TRUE) +
  scale_fill_viridis_c(option = "C") +
  theme(legend.position = "none")

当我在真实数据中有很多组时,这种方法效率不高。任何能更有效地完成它的建议将不胜感激。

我找到了 ,但是“这些数字需要根据 x 值的数量和 y 的范围进行调整”。我一直在寻找一种不必根据数据调整数字的方法。 David Gibson 的回答符合我的目的。

ggplot 似乎不支持此功能。通过向数据添加从 0 到 value) 的额外行,我能够得到一些接近的结果。然后使用 geom_tile 并通过指定 width.

来分隔图块
library(tidyverse)

df <- data.frame(value = c(20, 50, 90),
                 group = c(1, 2, 3))

df_expanded <- df %>%
  rowwise() %>%
  summarise(group = group,
            value = list(0:value)) %>%
  unnest(cols = value)

df_expanded %>%
  ggplot() +
  geom_tile(aes(
    x = group,
    y = value,
    fill = value,
    width = 0.9
  )) +
  coord_flip() +
  scale_fill_viridis_c(option = "C") +
  theme(legend.position = "none")

如果这太像素化了,您可以通过将 list(0:value) 替换为 seq(0, value, by = 0.1) 来增加生成的行数。

这是一个使用 ggforce 的真正黑客。这个包有一个可以采用颜色渐变的 geom,但它是用于线段的。我刚刚增加了尺寸,使线段看起来像条形。我让所有的条形长度相同以获得正确的渐变,然后用与背景颜色相同的颜色覆盖每个条形的一部分,使它们看起来是正确的长度。但是,必须隐藏网格线。 :-)

df %>% 
    ggplot() + 
    geom_link(aes(x = 0, xend = max(value), y = group, yend = group, color = stat(index)), size = 30) +
    geom_link(aes(x = value, xend = max(value), y = group, yend = group), color = "grey", size = 31) +
    scale_color_viridis_c(option = "C") +
    theme(legend.position = "none", panel.background = element_rect(fill = "grey"), 
          panel.grid = element_blank()) +
    ylim(0.5, max(df$group)+0.5 )