r - 使用填充的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 中只有两个不同的数字,但它适用于上面 Var1 的条形图。它也不是拼凑起来的,因为当我只渲染 Var3 条形图时也是如此。它也不仅仅是为 Var3 图表呈现的图例
有谁知道问题是什么或我如何强制 ggplot 正确对齐条形?
谢谢!
(R 版本 4.0.4 已修补 (2021-02-17 r80030);tidyverse v.1.3.1;patchwork v.1.1.1)
解决方案
第三个图未对齐,因为堆叠的条形图将值解释为numerical
,使其不适合堆叠(您是否堆叠x=1
并x= 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)
结果:
推荐阅读
- ajax - 使用 ajax 将用户对象发送到服务器是否存在安全问题?
- c++ - osg::BoundingBox 交点偏移检测
- python - 如何更改特定文件的工作目录
- hadoop - 为什么 hadoop fs -chmod 没用?
- c - 使用 64 位 MASM 优化 C 函数调用
- php - Laravel 查询 | 如何将 OrderBy 设置为新数组?
- python - 如何将击键发送到非活动/不集中的进程
- r - nls() 的后续步骤?
- azure-devops - 从构建/发布管道中,我们可以发现它的路径吗?
- python-3.x - 如何将“SeriesGroupBy”对象转换为列表