Likert包 - include.histogram + ggsave的问题

时间:2014-01-19 19:06:40

标签: r ggplot2 histogram reshape2

我使用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比例或直方图,但不能同时保存两者    它们。

2 个答案:

答案 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,可以保存,编辑等。代码在图之后。无法完全匹配颜色,但非常接近。工作流程如下:

  1. 加载数据
  2. 设置类别和回复标签
  3. 按类别创建回复条形图
  4. 创建缺失/已完成回复的条形图
  5. 合并到带注释的grob
  6. 保存
  7. ## 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)。它们还有宽度和高度参数。