我使用jbryer的likert包来绘制到目前为止工作得非常好的Likert数据。
1.但是当我在现有情节中添加include.histogram = TRUE
时,我收到错误消息:
二元运算符的非数字参数
请参阅提供的示例数据集:https://dl.dropboxusercontent.com/u/109495328/example.ods以及我在其上执行的代码(我的数据框称为rawdata)。
library(ggplot2)
library(reshape2)
library(likert)
require(devtools)
install_github('likert', 'jbryer')
teaching_liking <- rawdata[, substr(names(rawdata), 1, 4) == "B004"]
teaching_liking <- rename(teaching_liking, c(B004_01 = "expertise in the subject", B004_02 = "ability to engage students", B004_03 = "clarity", B004_04 = "attendance and punctuality to lessons", B004_05 = "attendance and punctuality to office hours", B004_06 = "availability to the relationship with students"))
i <- 1
while(i<=ncol(teaching_liking)) {
teaching_liking[[i]] = factor(teaching_liking[[i]],labels = c("Not at all", "A bit", "Enough", "Much"), levels=c(1:4))
i <- i + 1
}
teaching_liking_plot <- likert(teaching_liking)
p <- plot(teaching_liking_plot, centered = FALSE, wrap = 30, include.histogram = TRUE) + ggtitle("How satisfied are you with the following aspects?*")
g <- arrangeGrob(p, sub = textGrob("*Order of questions were randomized in questionaire.", x = 0, hjust = -0.1, vjust=0.1, gp = gpar(fontface = "italic", fontsize = 10)))
print(p)
ggsave((filename="teaching_liking.pdf"), scale = 1, width = par("din")[1], height = par("din")[2], units = c("in", "cm", "mm"), dpi = 300, limitsize = TRUE, g)
2.在极少数情况下,当我以某种方式设法获得完整的网络叠加图 直方图工作,我无法通过ggplot将它们保存在一个图中。它会 保存Likert比例或直方图,但不能同时保存两者 它们。
答案 0 :(得分:2)
这可能是plot.likert(...)
p <- plot(teaching_liking_plot, centered = FALSE, wrap = 30, include.histogram = F)
class(p)
# [1] "likert.bar.plot" "gg" "ggplot"
p <- plot(teaching_liking_plot, centered = FALSE, wrap = 30, include.histogram = T)
class(p)
# [1] "NULL"
在第一种情况下,plot.likert(...)
不显示图,但返回p
和“likert.bar.plot”对象。在第二种情况下,plot.likert(...)
会显示情节,但会返回NULL
(换句话说,p
会设置为NULL
)。这就是您尝试将plot(..., include.histogram=T)
的结果添加到ggtitle(...)
时出现错误的原因。
修改强>
这是一种解决方法。生成下面的图作为grob,可以保存,编辑等。代码在图之后。无法完全匹配颜色,但非常接近。工作流程如下:
## Version of likert analysis, with missing response histogram
libs <- list("reshape2","plyr","ggplot2","gridExtra","scales","RColorBrewer","data.table")
z <- lapply(libs,library,character.only=T)
rawdata <- fread("example.csv") # read rawdata into a data.table
teaching_liking <- rawdata[substr(names(rawdata), 1, 4) == "B004"]
# set up category and response labels
categories <- c(B004_01 = "expertise in the subject",
B004_02 = "ability to engage students",
B004_03 = "clarity",
B004_04 = "attendance and punctuality to lessons",
B004_05 = "attendance and punctuality to office hours",
B004_06 = "availability to the relationship with students")
responses <- c("Not at all", "A bit", "Enough", "Much")
# create the barplot of responses by category
ggB <- melt(teaching_liking, measure.vars=1:6, value.name="Response", variable.name="Category")
ggB[,resp.above:=sum(Response>2,na.rm=T)/sum(Response>0,na.rm=T),by=Category]
ggB[,resp.below:=sum(Response<3,na.rm=T)/sum(Response>0,na.rm=T),by=Category]
ggB[,Category:=reorder(Category,resp.above)] # sets the order of the bars
ggT <- unique(ggB[,list(Category,resp.below,resp.above)])
ggT[,label.below:=paste0(round_any(100*resp.below,1),"%")]
ggT[,label.above:=paste0(round_any(100*resp.above,1),"%")]
cat <- categories[levels(ggB$Category)] # category labels
cat <- lapply(strwrap(cat,30,simplify=F),paste,collapse="\n") # word wrap
ggBar <- ggplot(na.omit(ggB)) +
geom_histogram(aes(x=Category, fill=factor(Response)),position="fill")+
geom_text(data=ggT,aes(x=Category, y=-.05, label=label.below),hjust=.5, size=4)+
geom_text(data=ggT,aes(x=Category, y=1.05, label=label.above),hjust=.5, size=4)+
theme_bw()+
theme(legend.position="bottom")+
labs(x="",y="Percent")+
scale_y_continuous(labels=percent)+
scale_x_discrete(labels=cat)+
scale_fill_manual("Response",breaks=c(1,2,3,4),labels=responses, values=brewer.pal(4,"BrBG"))+
coord_flip()
ggBar
# create the histogram of Missing/Completed by category
ggH <- ggB[,list(Missing=sum(is.na(Response)),Completed=sum(!is.na(Response))),by="Category,resp.above"]
ggH[,Category:=reorder(Category,resp.above)]
ggH <- melt(ggH, measure.vars=3:4)
ggHist <- ggplot(ggH) +
geom_bar(data=subset(ggH,variable=="Missing"),aes(x=Category,y=-value, fill=variable),stat="identity")+
geom_bar(data=subset(ggH,variable=="Completed"),aes(x=Category,y=+value, fill=variable),stat="identity")+
geom_hline(yintercept=0)+
theme_bw()+
theme(legend.position="bottom")+
theme(axis.text.y=element_blank())+
labs(x="",y="n")+
scale_fill_manual("",values=c("grey80","dark red"),breaks=c("Missing","Completed"))+
coord_flip()
ggHist
# put it all together in a grid object, then save to pdf
grob <- arrangeGrob(ggBar,ggHist,ncol=2,widths=c(0.75,0.25),
main= textGrob("How satisfied are you with the following aspects?*",
hjust=.6, vjust=1.5,
gp = gpar(fontsize = 14)),
sub = textGrob("*Order of questions were randomized in questionaire.",
x = 0, hjust = -0.1, vjust=0.1,
gp = gpar(fontface = "italic", fontsize = 10)))
grob
ggsave(file="teaching_liking.pdf",grob)
答案 1 :(得分:0)
以下是第2部分的答案。我将不得不回到第1部分。
ggsave函数将保存最后一个 打电话给ggplot。由于直方图和条形图(左侧)是两个 单独调用ggplot,ggsave只保存最后一个。试试这个 代替:
pdf(‘mylikertplot.pdf’)
plot(l)
dev.off()
注意除了pdf之外还有其他功能用于其他文件 编队(例如png)。它们还有宽度和高度参数。