ggplot 中具有单独元素的水平堆叠条形图

iod*_*iod 0 r ggplot2

我试图想出一种以特定方式可视化一些李克特量表数据的方法。我什至不知道如何伪造它的样子,所以我希望我的解释足够了。

我有以下(假)数据:

n 个问题,每个问题有 5 个答案(非常同意、同意、不同意、非常不同意、不知道)

我想沿着中心轴可视化数据(最好使用 ggplot),以便两个“同意”答案位于左侧,两个“不同意”答案位于右侧,然后位于一个单独的块上一侧,代表“不知道”的块。它应该大致如下所示:

Q1:  *****++++++++|------!!     ?????
Q2:     ****++++++|----!!!!!!   ???????
Q3:       **++++++|---!!!       ??????????
      *: strongly agree, +: agree, -: don't agree, !:strongly disagree, ?: don't know
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这种表示方式允许比较同意和不同意的实际数量,而不会隐藏有多少“不知道”。我陷入困境的是如何为不知道的情况创建第二个元素。有任何想法吗?

以下是一些虚假数据:

structure(list(Q = structure(1:3, .Label = c("Q1", "Q2", "Q3"
), class = "factor"), SA = c(25, 18, 12), A = c(30, 25, 15), 
    DA = c(25, 20, 25), SDA = c(10, 18, 25), DK = c(10, 19, 23
    )), row.names = c(NA, -3L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

teu*_*and 5

正如评论中所建议的,您可以只分面“DK”类别。

library(ggplot2)
library(tidyr)
library(scales)

df <- structure(list(Q = structure(1:3, .Label = c("Q1", "Q2", "Q3"
), class = "factor"), SA = c(25, 18, 12), A = c(30, 25, 15), 
DA = c(25, 20, 25), SDA = c(10, 18, 25), DK = c(10, 19, 23
)), row.names = c(NA, -3L), class = "data.frame")

lvls <- colnames(df)[c(2,3,5,4,6)]

ggplot(
  pivot_longer(df ,-1),
  aes(y = Q, fill = name, group = factor(name, lvls),
      x = ifelse(name %in% c("A", "SA"), -1, 1) * value)
) +
  geom_col() +
  facet_grid(~ name == "DK", scales = "free_x", space = "free_x") +
  scale_fill_manual(
    values = c(viridis_pal()(4), "grey50"),
    limits = colnames(df)[-1]
  )
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2021 年 11 月 4 日创建(v2.0.1)