我有一个看起来像这样的数据框
df <- data.frame("V1" = c(0,0,0,0,0,2,2,2,2,2),
"V2" = c(9,9,9,0,0,2,2,2,0,0))
所以基本上我将某个值映射到相应的颜色(9 -> 白色(不可见)、0 -> 绿色 2 -> 红色),然后创建一个长度为等于数据框列中值的出现次数。有没有办法做这样的事情,即使用 ggplot2?
最佳答案
您可以使用pivot_longer
将数据帧更改为长格式。例如,使用 case_when
添加一列,其中包含要显示条形的颜色。您可以使用 scale_fill_identity
将条形填充为相应的颜色。要在堆叠条中获得与数据框相同的填充顺序,您可以使用 ggplot_build 来修改绘图的数据,方法是将“填充”列替换为与数据框顺序相同的向量。您可以使用以下代码:
library(ggplot2)
library(tidyr)
library(dplyr)
library(scales)
# Create plot
p <- df %>%
mutate(index = 1) %>%
pivot_longer(cols = -index) %>%
mutate(color = case_when(value == 9 ~ 'white',
value == 0 ~ 'darkgreen',
TRUE ~ 'red')) %>%
ggplot(aes(x = index, y = name, fill = color)) +
geom_col(width = 0.3) +
scale_fill_identity() +
theme_classic() +
scale_x_continuous(expand = c(0,0), breaks = pretty_breaks(2)) +
labs(x = '', y = '')
# Extract vector of colors in right order
vec_colors <- df %>%
mutate(index = 1) %>%
pivot_longer(cols = -index) %>%
mutate(color = case_when(value == 9 ~ 'white',
value == 0 ~ 'darkgreen',
TRUE ~ 'red')) %>%
arrange(name) %>%
pull(color)
# right order colors
vec_colors
#> [1] "darkgreen" "darkgreen" "darkgreen" "darkgreen" "darkgreen" "red"
#> [7] "red" "red" "red" "red" "white" "white"
#> [13] "white" "darkgreen" "darkgreen" "red" "red" "red"
#> [19] "darkgreen" "darkgreen"
# use ggplot_build to modify data and replace fill column with vector
q <- ggplot_build(p)
q$data[[1]] <- q$data[[1]] %>%
group_by(y) %>%
arrange(x, .by_group = TRUE)
q$data[[1]]$fill <- vec_colors
q <- ggplot_gtable(q)
# plot
plot(q)
创建于 2022 年 9 月 17 日 reprex v2.0.2
要添加图例,您应在 scale_fill_identity
中指定 guide = 'legend'
。要确定要在图例中显示哪些元素,您应该指定 labels
和 breaks
,如下所示:
library(ggplot2)
library(tidyr)
library(dplyr)
library(scales)
# Create plot
p <- df %>%
mutate(index = 1) %>%
pivot_longer(cols = -index) %>%
mutate(color = case_when(value == 9 ~ 'white',
value == 0 ~ 'darkgreen',
TRUE ~ 'red')) %>%
ggplot(aes(x = index, y = name, fill = color)) +
geom_col(width = 0.3) +
scale_fill_identity(guide = 'legend',
labels = c('darkgreen', 'red'),
breaks = c('darkgreen', 'red')) +
theme_classic() +
scale_x_continuous(expand = c(0,0), breaks = pretty_breaks(2)) +
labs(x = '', y = '')
# Extract vector of colors in right order
vec_colors <- df %>%
mutate(index = 1) %>%
pivot_longer(cols = -index) %>%
mutate(color = case_when(value == 9 ~ 'white',
value == 0 ~ 'darkgreen',
TRUE ~ 'red')) %>%
arrange(name) %>%
pull(color)
# use ggplot_build to modify data and replace fill column with vector
q <- ggplot_build(p)
q$data[[1]] <- q$data[[1]] %>%
group_by(y) %>%
arrange(x, .by_group = TRUE)
q$data[[1]]$fill <- vec_colors
q <- ggplot_gtable(q)
# plot
plot(q)
创建于 2022-09-24 reprex v2.0.2
关于r - 堆叠条形图的颜色取决于向量的数量和长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73756944/