【问题标题】:How to get two likert variables properly into one (ggplot2) sj.likert plot of the sjPlot package?如何将两个 likert 变量正确地放入 sjPlot 包的一个 (ggplot2) sj.likert 图?
【发布时间】:2014-05-22 10:36:11
【问题描述】:

我有一个包含两个 likert 变量的数据框。我想使用sjPlot 包的sjp.likert 函数绘制这两个变量。剧情没意思。

我的数据 (mydf) 如下所示:

structure(list(var1 = c(1, 1, 5, NA, 3, NA, 1, NA, 4, 3, 5, 5, 
4, 2, 2, NA, NA, 5, NA, NA), var2 = c(NA, NA, NA, 3, NA, 3, NA, 
5, NA, NA, NA, 2, NA, NA, NA, 4, 4, NA, 1, 1)), .Names = c("var1", 
"var2"), row.names = c(NA, 20L), class = "data.frame")

   var1 var2
1     1   NA
2     1   NA
3     5   NA
4    NA    3
5     3   NA
6    NA    3
7     1   NA
8    NA    5
9     4   NA
10    3   NA
11    5   NA
12    5    2
13    4   NA
14    2   NA
15    2   NA
16   NA    4
17   NA    4
18    5   NA
19   NA    1
20   NA    1

这是我使用的代码:

library(sjPlot)
library(RColorBrewer)

likert_5 <- mydf
levels_5 <- list(c(1,2,3,4,5))
varnames <- names(likert_5
sjp.likert(likert_5, legendLabels=levels_5, barColor="brewer",legendSize=0.5,axisLabelSize=0.5,valueLabelSize=2,colorPalette="BrBG", orderBy="pos",legendPos="bottom",axisLabels.y=varnames)

这是结果:

我认为你同意这根本没有意义。两个变量名相同,有四级而不是五级。有谁知道这里出了什么问题?

非常感谢!

【问题讨论】:

  • 也许您可以让我们更简单地回答您的问题:在 R 中使用 dput(yourDF) 为您提供代码,您可以在此处转储,以便我们在几秒钟内重建您的数据。
  • 嗨,Jaap,感谢您的建议。我添加了数据结构。

标签: r sjplot


【解决方案1】:

我相信这是sjp.likert 函数中的一个错误。一一添加参数,我发现在包含参数 orderBy = "pos" 之前,该图可以正常工作。查看函数源代码显示:

sjp.likert
# ...
# questionCount <- nrow(pos)/(length(legendLabels)/2)
# if (!is.null(orderBy)) {
#   ...
#   orderUniqueItems <- rev(1 + questionCount - orderUniqueItems)
#   axisLabels.y <- axisLabels.y[orderUniqueItems]
# }
# ...

使用您的数据,我最终得到以下结果:

questionCount
# [1] 1.6
orderUniqueItems
# [1] 1.6 0.6
varnames[c(1.6, 0.6)]
# [1] "var1"

我认为作者实际上想要questionCount &lt;-天花板(orderUniqueItems &lt;- c(unique(orderRelatedItems))),你的数据会产生:

questionCount
# [1] 2
orderUniqueItems
# [1] 2 1
varnames[c(1.6, 0.6)]
# [1] "var2" "var1"

快速解决方法是保存返回的绘图并手动修改标签(使用作者的代码创建粘贴了“n=”的标签)。

for (i in 1:length(varnames)) {
  varnames[i] <- paste(varnames[i], sprintf(" (n=%i)", length(na.omit(likert_5[,i]))), sep = "")
}
myplot <- sjp.likert(likert_5, legendLabels=levels_5, barColor="brewer", legendSize=0.5, axisLabelSize=0.5, valueLabelSize=2, colorPalette="BrBG", orderBy="pos", legendPos="bottom")
myplot$plot + scale_x_discrete(labels=varnames[c(2,1)])

编辑:

关于缺少的中间层,我也在代码中找到了这个:

if (!is.null(neutral)) {
  out <- out[out$Response != neutral, ]
}

从输出中删除中间的“中性”类别。似乎没有改变这一点的选项,the author's examples 都没有使用奇数个类别。所以它似乎是一个特性,而不是一个错误。

您可以考虑使用likert 包,特别是带有参数include.center = TRUE 的函数likert.bar.plot

【讨论】:

  • JVL 感谢您的研究!我将“orderBy”设置为NULL,我的部分问题得到了解决(所以我没有使用你的快速修复),但另一部分仍然存在:图中有四个李克特值,而我的数据中有五个.关于如何解决这个问题的任何想法?
  • 我编辑了我的答案来解决这个问题,但似乎没有简单的方法解决它。
  • 谢谢!我之前使用过 likert 包,但我遇到了太多关于缺少关卡的问题。不过我可以再试一次。
  • 我对我的包中 sjp.likert 函数的当前实现不满意。但是,我完全重写了该功能,现在正尝试将其包含在内。由于新的 likert 函数使用 R 基础图形,我可能会添加新的 likert 函数作为替代,而不是替换使用 ggplot 的旧函数。 @JVL:感谢您的提示,我会查看代码中可能存在的错误。
猜你喜欢
  • 2021-07-14
  • 1970-01-01
  • 2023-03-29
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2021-07-26
相关资源
最近更新 更多