条形图中的百分比标签

时间:2016-02-20 15:19:39

标签: r ggplot2 label

我想制作一个类似于此的图形:

relative frequency

我从这段代码开始:

library(ggplot2)
library(scales) #needed for labels=percent

var1 <- sample(0:20,78,replace = TRUE)

var2 <- cut(var1, breaks = seq(0,20,5),include.lowest = TRUE)
df<-as.data.frame(var2)

ggplot(df, aes(x= var2)) + 
      geom_bar(aes(y = ..prop..,group=1),fill="dodgerblue3")+
      scale_y_continuous(labels=percent)+
      labs(x = NULL,y = NULL)+
      theme(axis.ticks.x = element_blank(),
            axis.text = element_text(size=7)) 

但是我无法将标签放在情节中。

我试图关注this example

ggplot(df, aes(x= var2,  group=1)) + 
  geom_bar(aes(y = ..density..)) +
  geom_text(aes( label = format(100*..density.., digits=2, drop0trailing=TRUE),
                 y= ..density.. ), stat= "bin", vjust = -.5) +
  scale_y_continuous(labels=percent)

但是我得到了这个错误(我使用ggplot2-version 2.0.0):

  

错误:StatBin需要一个连续的x变量x变量是离散的。也许你想要stat =&#34; count&#34;?

最后我用这段代码制作了剧情:

per <- df %>% group_by(var2) %>% summarise(freq = n()/nrow(df))

ggplot(data=per, aes(x=var2,y=freq)) +
      geom_bar(stat="identity",fill="dodgerblue3")+
      geom_text(aes(label=percent(freq)),vjust=1.5,colour="white")+
      scale_y_continuous(labels=percent)+
      labs(x = NULL,y = NULL)+
      theme(axis.ticks.x = element_blank(),
            axis.text = element_text(size=7))

但是,是否可以将其设为this example,而不需要per数据框并直接在ggplot中?

1 个答案:

答案 0 :(得分:4)

你可以试试这个,取自here并自定义。

ggplot(df, aes(factor(var2))) +
  geom_bar(fill="dodgerblue3")+
  labs(x = NULL,y = NULL)+
  stat_bin(aes(label = paste(prop.table(..count..) * 100, "%", sep = "")),
           vjust = 1, geom = "text", position = "identity", color ="white")

给出:enter image description here

修改

在新的ggplot 2.0.X版本中,应使用stat_count而不是stat_bin。来自help

  

stat_count,它计算每个x posotion的个案数,   没有装箱。它适用于离散和连续x   数据,而stat_bin仅适用于连续的x数据。

   ggplot(df, aes(factor(var2))) +
      geom_bar(fill="dodgerblue3")+
      labs(x = NULL,y = NULL)+
      stat_count(aes(label = paste(prop.table(..count..) * 100, "%", sep = "")),
               vjust = 1, geom = "text", position = "identity", color ="white")