首页 > 解决方案 > 使用填充的geom_bar中未对齐的条

问题描述

我对 ggplot 的 geom_bar 有疑问。

我有几个条形图从几个变量都使用相同的第四个变量作为填充: 三个堆积条形图使用

出于某种原因,在第三张图表中,队列 2 的列未对齐。所有三个图表都使用相同的数据集和相同的代码。

library(tidyverse)
library(patchwork)
myColours <- c("#A71C49","#11897A","#DD4814", "#282A36")


DataSet <- structure(list(`Var1` = c(3, 2, 5, 3, 4, 1, 3, 1, 
                                     5, 4, 5, 3, 5, 5, 5, 4, 4, 5, 4, 5, 5, 5, 5, 1, 5, 5, 4, 4, 3, 
                                     5, 5, 4, 1, 3, 5, 2, 5, 5, 4, 4, 2, 5, 1, 5, 3, 5, 5, 5, 2, 5, 
                                     3, 1, 5, 5, 5, 5, 4), `Var2` = c(3, 1, 4, 1, 2, 2, 
                                                                      3, 1, 3, 3, 3, 3, 2, 5, 5, 1, 4, 4, 5, 5, 4, 5, 3, 2, 3, 5, 2, 
                                                                      3, 3, 5, 5, 2, 1, 3, 4, 2, 4, 5, 3, 3, 5, 3, 1, 4, 3, 5, 3, 4, 
                                                                      2, 4, 1, 4, 4, 5, 1, 3, 3), `Var3` = c(3, 2, 1, 
                                                                                                             3, 1, 4, 3, 2, 4, 3, 3, 3, 5, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 4, 
                                                                                                             5, 2, 4, 4, 4, 5, 5, 1, 1, 3, 5, 2, 5, 5, 3, 4, 3, 1, 1, 4, 3, 
                                                                                                             2, 5, 4, 2, 4, 4, 1, 4, 5, 1, 5, 2), Cohort = structure(c(1L, 
                                                                                                                                                                       1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
                                                                                                                                                                       3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
                                                                                                                                                                       3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
                                                                                                                                                                       4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("1", "2", "3", "4"
                                                                                                                                                                       ), class = "factor")), row.names = c(NA, -57L), class = c("tbl_df", 
                                                                                                                                                                                                                                 "tbl", "data.frame"))


c5 <- ggplot(DataSet, aes(`Var1`, fill=Cohort)) +
  geom_bar() +
  theme(legend.position = "none")  +
  ylim(0,25) +
  scale_fill_manual(values=myColours)

c6 <- ggplot(DataSet, aes(`Var2`, fill=Cohort)) +
  geom_bar() +
  theme(legend.position = "none")  +
  ylim(0,25) +
  scale_fill_manual(values=myColours)

c7 <- ggplot(DataSet, aes(`Var3`, fill=Cohort)) +
  geom_bar() +
  ylim(0,25) +
  scale_fill_manual(values=myColours)

(c5 | c6 ) /
(c7 | guide_area())

我有以下错误消息:

1: Removed 2 rows containing missing values (geom_bar). 
2: position_stack requires non-overlapping x intervals 

缺失值指的是 Var1 的图形,即第三个图形的非重叠 x 区间。如果我只渲染 Cohort 2,我也会得到这些奇怪的错位条: 与以前相同的未对齐,但只有队列 2 可见

与 Cohort 3 Var 3 进行比较 一个漂亮的条形图

我会怀疑这样一个事实,即队列 2 中只有两个不同的数字,但它适用于上面 Var1 的条形图。它也不是拼凑起来的,因为当我只渲染 Var3 条形图时也是如此。它也不仅仅是为 Var3 图表呈现的图例

有谁知道问题是什么或我如何强制 ggplot 正确对齐条形?

谢谢!

(R 版本 4.0.4 已修补 (2021-02-17 r80030);tidyverse v.1.3.1;patchwork v.1.1.1)

标签: rggplot2tidyverse

解决方案


第三个图未对齐,因为堆叠的条形图将值解释为numerical,使其不适合堆叠(您是否堆叠x=1x= 1.00001彼此叠放等?)。将其转换为有序向量有助于 ggplot 理解。

仅使用 tidyverse 考虑此示例:

myColours <- c("#A71C49","#11897A","#DD4814", "#282A36")

# Lenthen the dataset
DataSet2 <- DataSet %>% pivot_longer(cols = -Cohort,names_to = "Variable")

# This helps against the non-overlapping x intervals issue
DataSet2$value <- as.ordered(DataSet2$value)

ggplot(DataSet2,aes(x=value,fill=Cohort)) +
  geom_bar(position= position_stack()) + ylim(0,25)+
  facet_wrap(vars(Variable)) +  # make multiple graphs split by the column "Variable"
  scale_fill_manual(values=myColours)

结果:

在此处输入图像描述


推荐阅读