r - 堆叠条形图的颜色取决于向量的数量和长度

标签 r ggplot2 plot

我有一个看起来像这样的数据框

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

我想以这种方式创建一个堆叠条形图: enter image description here

所以基本上我将某个值映射到相应的颜色(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'。要确定要在图例中显示哪些元素,您应该指定 labelsbreaks,如下所示:

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/

相关文章:

r - 用 R 计算季节性平均值的最优雅方法是什么?

r - 使用 ggplot 将图例添加到多线图中

r - geom_smooth() 中 "method"参数值有什么区别

r - 创建具有不同间隔宽度且图例级别之间没有间隔的离散颜色条

应该将 xts 类数据绘制到 png 文件的 R 脚本不会生成 png 文件

r - 如何获取已格式化的日期变量的有序对象?

R:如何使用 RMarkdown ioslides 制作二级缩进的要点?

在 Julia 中绘制相关散点矩阵图

r - 提取 lmer 随机效应的置信区间;用 dotplot(ranef()) 绘制

r - 哪个是存储 R 包小插图中使用的图像的正确文件夹?