我正在使用 the jbryer/likert
package绘制李克特数据。
考虑名为 items
的响应表——这里,A
, B
,等等是列名,而不是数据的一部分:
A B C D
5 4 5 4
3 3 3 4
2 2 2 2
2 2 2 3
5 3 6 7
3 3 5 4
以及以下代码:
choices = c("Very low", "Low", "Rather low", "Neither low nor high", "Rather high", "High", "Very high")
for(i in 1:ncol(items)) {
items[,i] = factor(items[,i], levels=1:7, labels=choices, ordered=TRUE)
}
现在,我们将其转换为
likert
数据并绘制它,它用一个使用 ggplot
的函数覆盖了内置的绘图函数。 :plot(likert(items), ordered=FALSE)
这给了我:
凉爽的。都下单了。但是
A
, B
等作为条件的描述符没有意义,我想覆盖它们:names(items) = c("LT", "ST", "SemTag", "SemTagContext")
这给了我错误的顺序:
看看如何
ST
尽管它是 B
的名称,但排在第一位?我的订单变成了 B
, D
, C
, A
.如何让它保留顺序并返回
D
中的条形图, C
, B
, A
— 或者,使用我的新组名:SemTagContext
, SemTag
, ST
, LT
?注:以上数据表已缩短。图中的条形宽度不反射(reflect)这个简短的数据示例,而是我拥有的完整数据集。问题是一样的。
最佳答案
正如乔恩建议的那样,我决定自己重新实现它:
# additional requirements
library(ggplot2)
library(reshape2)
library(RColorBrewer)
# create summary table
table_summary = likert(items)
# reshape results
results = melt(table_summary$results, id.vars='Item')
# reorder results
results$Item = factor(results$Item, levels=c("LT", "ST", "SemTag", "SemTagContext"))
# some defaults
ymin = 0
text.size = 3
ggplot(results, aes(y=value, x=Item, group=Item)) +
geom_bar(stat='identity', aes(fill=variable)) +
ylim(c(-5,105)) +
coord_flip() +
scale_fill_manual('Response', values=brewer.pal(7, "RdYlGn"),
breaks=levels(results$variable),
labels=levels(results$variable)) +
geom_text(data=table_summary$summary, y=ymin, aes(x=Item,
label=paste(round(low), '%', sep='')),
size=text.size, hjust=1) +
geom_text(data=table_summary$summary, y=100, aes(x=Item,
label=paste(round(high), '%', sep='')),
size=text.size, hjust=-.2) +
ylab('Percentage') + xlab('')
这会产生正确的顺序:
关于使用 R 重新排序李克特图中的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14415674/