如何使用 ggplot2将标签放在 R 中的 geom_bar 上

我想有一些标签堆叠在一个 geom_bar图表的顶部。这里有一个例子:

df <- data.frame(x=factor(c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE)))
ggplot(df) + geom_bar(aes(x,fill=x)) + opts(axis.text.x=theme_blank(),axis.ticks=theme_blank(),axis.title.x=theme_blank(),legend.title=theme_blank(),axis.title.y=theme_blank())

现在

表(df $x)

FALSE  TRUE
3     5

我想把3和5放在两格上面。如果我能得到百分比值就更好了。例如 3 (37.5%)5 (62.5%)。像这样:
(来源: Skitch.com)

这可能吗? 如果可能,怎么可能?

179503 次浏览

与 ggplot 中的许多任务一样,通常的策略是将要添加到绘图中的内容放入数据框架中,使变量与绘图中的变量和美学相匹配。例如,你可以创建一个新的数据框架,如下所示:

dfTab <- as.data.frame(table(df))
colnames(dfTab)[1] <- "x"
dfTab$lab <- as.character(100 * dfTab$Freq / sum(dfTab$Freq))

因此,x变量匹配 df中的相应变量,以此类推。然后使用 geom_text简单地包含它:

ggplot(df) + geom_bar(aes(x,fill=x)) +
geom_text(data=dfTab,aes(x=x,y=Freq,label=lab),vjust=0) +
opts(axis.text.x=theme_blank(),axis.ticks=theme_blank(),
axis.title.x=theme_blank(),legend.title=theme_blank(),
axis.title.y=theme_blank())

这个例子将只绘制百分比图,但是你也可以通过类似下面这样的东西把计数结合在一起:

dfTab$lab <- paste(dfTab$Freq,paste("(",dfTab$lab,"%)",sep=""),sep=" ")

请注意,在 ggplot2的当前版本中,不推荐使用 opts,因此我们现在将使用 themeelement_blank

要在 ggplot上绘制文本,可以使用 geom_text。但是我发现首先使用 ddply对数据进行总结是有帮助的

dfl <- ddply(df, .(x), summarize, y=length(x))
str(dfl)

由于数据是预先汇总的,因此需要记住更改将 stat="identity"参数添加到 geom_bar:

ggplot(dfl, aes(x, y=y, fill=x)) + geom_bar(stat="identity") +
geom_text(aes(label=y), vjust=0) +
opts(axis.text.x=theme_blank(),
axis.ticks=theme_blank(),
axis.title.x=theme_blank(),
legend.title=theme_blank(),
axis.title.y=theme_blank()
)

enter image description here

另一种解决方案是在处理离散变量时使用 stat_count()(连续变量时使用 stat_bin())。

ggplot(data = df, aes(x = x)) +
geom_bar(stat = "count") +
stat_count(geom = "text", colour = "white", size = 3.5,
aes(label = ..count..),position=position_stack(vjust=0.5))

enter image description here

这是我们最初的名单

library(ggplot2)


df <- data.frame(x=factor(c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE)))


p <- ggplot(df, aes(x = x, fill = x)) +
geom_bar()
p

initial barplot without labels

根据 元宁的建议,我们可以使用 stat_count()

geom_bar()默认使用 stat_count()。正如 ggplot2 参考文献中提到的,stat_count()返回两个值: count表示 bin 中的点数,prop表示分组比例。因为我们的组匹配 x 值,所以两个 prop都是1,没有用处。但我们可以使用 count(简称为「。.计数。”)在我们的 geom_text()中,它实际上表示酒吧的高度。注意,我们还必须在 geom_text()调用中包含“ stat = ‘ count’”。

因为我们希望在标签中同时包含计数和百分比,所以我们需要在“标签”审美中使用一些计算和字符串粘贴,而不仅仅是“。.计数。.我更喜欢添加一行代码,从“ scale”包中创建一个包装器百分比格式化函数(与“ ggplot2”一起发布)。

pct_format = scales::percent_format(accuracy = .1)


p <- p + geom_text(
aes(
label = sprintf(
'%d (%s)',
..count..,
pct_format(..count.. / sum(..count..))
)
),
stat = 'count',
nudge_y = .2,
colour = 'royalblue',
size = 5
)
p

barplot with labels

当然,您可以进一步编辑与 coloursize,轻推,调整等标签。