在这种情况下,计数不会因问题而异,因此您只需要一张表格来记录回复的数量。以下是在每个问题旁边放置回复数量的方法,适用于回复数量变化的情况,或作为单个表格。
按问题添加回复数
执行此操作的一种方法是修改likert.bar.plot 的基础代码,以包含添加响应计数的功能。在这里,我刚刚破解了likert.bar.plot 的输出,以便在事后添加响应计数。
library(dplyr)
library(gridExtra)
library(reshape2)
首先,通过Item 获取每个CNT 的响应计数。末尾的variable=NA 在那里,因为likert.bar.plot 在创建绘图时生成的原始数据框创建并使用了一个名为variable 的列。即使我们在后续调用 geom_text 时不使用该列和下面的新数据框,ggplot 仍然希望该列出现在新数据框中。
counts = pisaitems %>%
select(CNT, matches("ST24Q")) %>%
melt(id.var="CNT", variable.name="Item") %>%
count(CNT, Item) %>%
mutate(variable=NA)
我们使用geom_text按项目添加响应计数,但我们需要对plot(l28g)的输出进行一些其他更改,如下所示:
使用 scale_y_continuous 将 y 轴范围扩大到 150,以便文本值(我设置为 145)可见。这将覆盖plot(l28g) 创建的原始图中的 y 比例(调用likert.bar.plot 来实际生成图)。
将可见的 y 轴范围设置为停止在 110。我们在 coord_flip() 内执行此操作,这会覆盖来自 likert.bar.plot 的原始 coord_flip()。我们这样做是为了使响应数量的文本恰好位于绘图区域的右侧,而不是在绘图区域内。
增加绘图右侧边距,使绘图右侧有一些空间。
关闭剪裁,使打印在绘图区域外的文本可见。
这是剧情代码。渲染可能需要几秒钟,所以请耐心等待。
p = plot(l28g) +
geom_text(data=counts,
aes(label=format(n,big.mark=","), x=CNT, y=145),
size=2.5, colour="grey30", hjust=1) +
scale_y_continuous(limits=c(-100,150)) +
coord_flip(ylim=c(-110,110)) +
theme(plot.margin=unit(c(0.2,2,0.2,0.2),"cm"))
# Turn off clipping
# http://stackoverflow.com/a/9691256/496488
p <- ggplot_gtable(ggplot_build(p))
p$layout$clip <- "off"
grid.draw(p)
在单个表中添加响应数
一种选择是创建一个表格 grob(grob = 图形对象)并将其放置在主图的旁边或下方。例如:
library(dplyr)
library(gridExtra)
library(reshape2)
tt <- ttheme_default(
core=list(fg_params=list(fontsize=9)),
colhead=list(fg_params=list(fontsize=9)),
rowhead=list(fg_params=list(fontsize=9)))
grid.arrange(plot(l28g),
arrangeGrob(nullGrob(),
textGrob("Number of Responses",
gp=gpar(fontsize=11,fontface="bold")),
tableGrob(pisaitems %>%
rename(Country=CNT) %>%
count(Country) %>%
mutate(n=format(n, big.mark=",")),
theme=tt, rows=NULL),
nullGrob(),
heights=c(15,1,5,15)),
widths=c(3,1))