更改 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 )
有了这个数据:
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")
当我在真实数据中有很多组时,这种方法效率不高。任何能更有效地完成它的建议将不胜感激。
我找到了
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 )