我有一个数据帧,看起来像这样

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

I would like to create a stacked barplot in this fashion: enter image description here

因此,基本上我将某个值映射到相应的 colored颜色 (9-白色(invisible),0-绿色2-红色),然后创建一个长度等于该值在DataFrame列中出现的次数的条形图.有没有办法做到这一点,比如使用ggplot2?

推荐答案

您可以使用pivot_longer将数据帧更改为长格式.例如,使用case_when添加一列,其中包含要显示的条形图的 colored颜色 .您可以使用scale_fill_identity将条形图填充为相应的 colored颜色 .要获得与数据帧相同的顺序填充堆叠条形图,您可以使用ggplot_build修改绘图数据,方法是用与数据帧相同顺序的矢量替换"Fill"列.您可以使用以下代码:

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-09-17年第reprex v2.0.2

R相关问答推荐

R的GG平行坐标图中的排序变量

R形式的一维数字线/箱形图样式图表

如何在R中正确对齐放射状图中的文本

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

使用tidyverse / Mutate的存款账户余额

R Tidymodels textercipes-使用spacyR进行标记化-如何从生成的标记列表中删除标点符号

r替换lme S4对象的字符串的一部分

Rplotly中的Sankey Diagram:意外连接&

在R中使用download. file().奇怪的URL?

删除具有相同标题的tabPanel(shinly)

当我们有多个特殊字符时,使用gsub删除名称和代码'

将多个列合并为一个列的有效方法是什么?

当由base::限定时,`[.factor`引发NextMethod错误

如何在GALT包的函数&geom_x样条线中调整线宽

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容

如何在R中创建这些列?

隐藏基于 case 总数的值

有没有办法更改ggplot2中第二个y轴的比例限制?

是什么打破了此Quarto仪表板中的工具提示?

列间序列生成器的功能