如果您真的想使用包含如此大量项目的堆叠条形图,这里有两种可能的解决方案。
使用irutils
几个月前我遇到了这个包裹。
从Github上的提交 0573195c07 开始,该代码将无法使用grouping=
参数。让我们去参加周五的调试会议。
首先从 Github 下载一个压缩版本。您需要破解R/likert.R
文件,特别是likert
andplot.likert
函数。首先,使用 in likert
,cast()
但从reshape
不加载包(尽管文件import(reshape)
中有说明NAMESPACE
)。您可以事先自行加载。其次,获取项目标签的指令不正确,其中 ai
在第 175 行附近悬空。这也必须修复,例如通过将所有出现的 替换likert$items[,i]
为likert$items[,1]
。然后,您可以按照您在机器上使用的方式安装该软件包。在我的 Mac 上,我做到了
% tar -czf irutils.tar.gz jbryer-irutils-0573195
% R CMD INSTALL irutils.tar.gz
然后,使用 R,尝试以下操作:
library(irutils)
library(reshape)
# Simulate some data (82 respondents x 66 items)
resp <- data.frame(replicate(66, sample(1:5, 82, replace=TRUE)))
resp <- data.frame(lapply(resp, factor, ordered=TRUE,
levels=1:5,
labels=c("Strongly disagree","Disagree",
"Neutral","Agree","Strongly Agree")))
grp <- gl(2, 82/2, labels=LETTERS[1:2]) # say equal group size for simplicity
# Summarize responses by group
resp.likert <- likert(resp, grouping=grp)
这应该可以工作,但是由于项目数量众多,视觉渲染会很糟糕。但是,它无需分组(例如,plot(likert(resp))
)即可工作。
因此,我建议将您的数据集减少为较小的项目子集。例如,使用 12 个项目,
plot(likert(resp[,1:12], grouping=grp))
我得到一个“可读”的堆积条形图。您可能可以在之后处理它们。(这些是对象,但由于可读性问题ggplot2
,您将无法将它们排列在单个页面上!)gridExtra::grid.arrange()
替代解决方案
我想提请您注意另一个包HH,它允许将李克特量表绘制为发散的堆叠条形图。我们可以重用上面的代码,如下所示:
resp.likert <- likert(resp)
detach(package:irutils)
library(HH)
plot.likert(resp.likert$results[,-6]*82/100, main="")
但这会使事情变得有点复杂,因为我们需要将频率转换为计数、子集likert
生成的对象irutils
、分离包等。所以让我们从新的(计数)统计数据重新开始:
plot.likert(t(apply(resp, 2, table)), main="", as.percent=TRUE,
rightAxisLabels=NULL, rightAxis=NULL, ylab.right="",
positive.order=TRUE)
要使用分组变量,您需要使用array
数值。
# compute responses frequencies separately by grp
resp.array <- array(NA, dim=c(66, 5, 2))
resp.array[,,1] <- t(apply(subset(resp, grp=="A"), 2, table))
resp.array[,,2] <- t(apply(subset(resp, grp=="B"), 2, table))
dimnames(resp.array) <- list(NULL, NULL, group=levels(grp))
plot.likert(resp.array, layout=c(2,1), main="")
这将生成两个单独的面板,但它适合单个页面。
编辑 2016-6-3
- 截至目前,likert可作为单独的软件包提供。
- 您不需要reshape库或分离irutils和reshape