改变 ggplot 条形图的填充颜色

4

使用这个数据:

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")

enter image description here

但我希望这些条形图的颜色能根据它们对应的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")

enter image description here

这种方法在实际数据中有很多组时效率不高。如果有更高效的建议,请告诉我。
我找到了以前类似问题的被接受答案, 但是"这些数字需要根据x值和y范围进行调整"。我正在寻找一种不需要根据数据调整数字的方法。David Gibson的答案符合我的目的。

1
这个回答解决了你的问题吗?为geom_bar图创建垂直颜色渐变 - benson23
我想问一下,您是否真的想这样做,因为在我看来,这并不是最佳的数据可视化实践。条形图用于显示离散变量的一个计数 - 所以实际上只有顶部的值对于我们有意义。渐变则会引导读者产生不准确的想法,似乎数据中存在某种密度或变化率,但实际上却不存在。 - neilfws
@neilfws 我正在制作许多图表,显示从0到100的值随时间变化的视频。 - Zhiqiang Wang
2个回答

7

看起来 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")

enter image description here

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

enter image description here


1
太好了!谢谢。这对我的目的来说已经足够好了。 - Zhiqiang Wang

1

这是一个使用ggforce的真正技巧。该软件包具有一种几何形状,可以采用颜色渐变,但它是针对线段的。我只是增加了大小,使线段看起来像条形图。我将所有的条形图长度设为相同,以获得正确的渐变,然后用与背景颜色相同的颜色覆盖每个条形图的一部分,使它们看起来长度正确。然而,必须隐藏网格线。 :-)

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 )

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接