我想在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已被弃用,因此,我们将使用theme和element_blank现在.
Mar*_*eth 10
所以,这是我们的初始图\xe2\x86\x93
\nlibrary(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\nRun Code Online (Sandbox Code Playgroud)\n
根据Yuan-ning的建议,我们可以使用stat_count().
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()请注意,我们还
由于我们希望标签中同时包含计数和百分比,因此我们\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 一起提供)创建包装百分比格式化函数。
\npct_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\nRun Code Online (Sandbox Code Playgroud)\n
colour当然,您可以使用、size、微移、调整等进一步编辑标签,或者glue::glue()使用sprintf()需要使用 。
UPD: ggplot2 作者现在坚持使用after_stat(something)而不是通常的..something..符号。因此,第二部分(添加标签)的最新版本现在有点庞大,但产生完全相同的结果:
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)\nRun Code Online (Sandbox Code Playgroud)\n
另一种解决方案是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)