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

ang*_*man 53 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())
Run Code Online (Sandbox Code Playgroud)

现在

表(DF $ X)

FALSE  TRUE 
    3     5 
Run Code Online (Sandbox Code Playgroud)

我想在两个酒吧的顶部有3和5.如果我也可以获得百分比值,那就更好了.例如3 (37.5%)5 (62.5%).像这样:

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

And*_*rie 47

要绘制文字,ggplot请使用geom_text.但我发现首先使用汇总数据很有帮助ddply

dfl <- ddply(df, .(x), summarize, y=length(x))
str(dfl)
Run Code Online (Sandbox Code Playgroud)

由于数据是预先汇总的,因此您需要记住将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()
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


jor*_*ran 35

与ggplot中的许多任务一样,一般策略是将您想要添加到绘图中的内容放入数据框中,使得变量与绘图中的变量和美学相匹配.例如,您将创建一个新的数据框,如下所示:

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

这样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())
Run Code Online (Sandbox Code Playgroud)

这个例子只会绘制百分比,但你也可以paste通过类似的方式计算:

dfTab$lab <- paste(dfTab$Freq,paste("(",dfTab$lab,"%)",sep=""),sep=" ")
Run Code Online (Sandbox Code Playgroud)

请注意,在GGPLOT2的当前版本,opts已被弃用,因此,我们将使用themeelement_blank现在.


Mar*_*eth 10

所以,这是我们的初始图\xe2\x86\x93

\n
library(ggplot2)\n\ndf <- data.frame(x=factor(c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE)))\n\np <- ggplot(df, aes(x = x, fill = x)) +\n  geom_bar()\np\n
Run Code Online (Sandbox Code Playgroud)\n

没有标签的初始条形图

\n

根据Yuan-ning的建议,我们可以使用stat_count().

\n

geom_bar()stat_count()默认使用。正如 ggplot2参考文献中提到的,stat_count()返回两个值:countbin 中的点数和prop分组比例。由于我们的组与 x 值匹配,因此两个props 均为 1 并且 \xe2\x80\x99 没有用。但我们可以count在我们的geom_text(). 请注意,我们必须将 \xe2\x80\x9cstat = \'count\'\xe2\x80\x9d 包含到我们的geom_text()请注意,我们还

\n

由于我们希望标签中同时包含计数和百分比,因此我们\xe2\x80\x99将需要在\xe2\x80\x9clabel\xe2\x80\x9d美学中进行一些计算和字符串粘贴,而不仅仅是\xe2\x80\x9c..计数..\xe2\x80\x9d。我更喜欢添加一行代码来从 \xe2\x80\x9cscales\xe2\x80\x9d 包(随 \xe2\x80\x9cggplot2\xe2\x80\x9d 一起提供)创建包装百分比格式化函数。

\n
pct_format = scales::percent_format(accuracy = .1)\n\np <- p + geom_text(\n    aes(\n      label = sprintf(\n        \'%d (%s)\',\n        ..count..,\n        pct_format(..count.. / sum(..count..))\n      )\n    ),\n    stat = \'count\',\n    nudge_y = .2,\n    colour = \'royalblue\',\n    size = 5\n  )\np\n
Run Code Online (Sandbox Code Playgroud)\n

带标签的条形图

\n

colour当然,您可以使用、size、微移、调整等进一步编辑标签,或者glue::glue()使用sprintf()需要使用 。

\n

UPD: ggplot2 作者现在坚持使用after_stat(something)而不是通常的..something..符号。因此,第二部分(添加标签)的最新版本现在有点庞大,但产生完全相同的结果:

\n
pct_format = scales::percent_format(accuracy = .1)\n\np <- p + geom_text(\n  aes(\n    label = sprintf(\n      \'%d (%s)\',\n      after_stat(count),\n      pct_format(after_stat(count) / sum(after_stat(count)))\n    )\n  ),\n  stat = \'count\',\n  nudge_y = .2,\n  colour = \'royalblue\',\n  size = 5\n)\n
Run Code Online (Sandbox Code Playgroud)\n


yua*_*ing 9

另一种解决方案是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))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明