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

时间:2011-06-23 13:48:47

标签: r ggplot2

我想在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%)。像这样:

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

4 个答案:

答案 0 :(得分:44)

要在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

答案 1 :(得分:33)

与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())

此示例仅绘制百分比,但您可以paste同时计算这些数字:

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

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

答案 2 :(得分:4)

另一种解决方案是在处理离散变量时使用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

答案 3 :(得分:1)

所以,这是我们最初的情节↓

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

按照yuan-ning的建议,我们可以使用stat_count()

geom_bar() 默认使用 stat_count()。如 ggplot2 reference 中所述,stat_count() 返回两个值:count 表示 bin 中的点数,prop 表示分组比例。由于我们的组匹配 x 值,因此 prop 都是 1 并且没有用。但是我们可以在 count 中使用实际表示条形高度的 geom_text()(称为“..count..”)。请注意,我们还必须在 geom_text() 调用中包含“stat = 'count'”。

由于我们希望标签中同时包含计数和百分比,因此我们需要在“标签”美学中进行一些计算和字符串粘贴,而不仅仅是“..count..”。我更喜欢添加一行代码来从“scales”包(随“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、微调、调整等进一步编辑标签。