如何将堆积百分比条形图标签居中

AK4*_*K47 22 r labels bar-chart ggplot2

我试图绘制好的stacked percent barchart使用ggplot2.我已经阅读了一些材料,几乎可以设法绘制,我想要什么.另外,我附上材料,它可能在一个地方有用:

如何在不创建摘要数据框的情况下在ggplot2中标记堆积条形图?

创建堆叠的条形图,其中每个堆栈按比例缩放为100%

R堆积百分比条形图,包含二元因子和标签的百分比(使用ggplot)

我的问题是我不能放在labels我想要的地方- 在酒吧中间.在此输入图像描述

您可以在上面的图片中看到问题 - 标签看起来很糟糕,并且彼此重叠.

我现在正在寻找的是:

  1. 如何在酒吧(区域)的中间放置标签

  2. 如何绘制不是所有标签,但例如哪些标签超过10%?

  3. 如何解决重叠问题?

对于Q 1.@MikeWise建议可能的解决方案.但是,我仍然无法处理这个问题.

另外,我附上了可重复的例子,我是如何绘制这个grahp的.

library('plyr')
library('ggplot2')
library('scales')
set.seed(1992)
n=68

Category <- sample(c("Black", "Red", "Blue", "Cyna", "Purple"), n, replace = TRUE, prob = NULL)
Brand <- sample("Brand", n, replace = TRUE, prob = NULL)
Brand <- paste0(Brand, sample(1:5, n, replace = TRUE, prob = NULL))
USD <- abs(rnorm(n))*100

df <- data.frame(Category, Brand, USD)

# Calculate the percentages
df = ddply(df, .(Brand), transform, percent = USD/sum(USD) * 100)


# Format the labels and calculate their positions
df = ddply(df, .(Brand), transform, pos = (cumsum(USD) - 0.5 * USD))

#create nice labes
df$label = paste0(sprintf("%.0f", df$percent), "%")  



ggplot(df, aes(x=reorder(Brand,USD,
                              function(x)+sum(x)),  y=percent, fill=Category))+
  geom_bar(position = "fill", stat='identity',  width = .7)+
  geom_text(aes(label=label, ymax=100, ymin=0), vjust=0, hjust=0,color = "white",  position=position_fill())+
  coord_flip()+
  scale_y_continuous(labels = percent_format())+
  ylab("")+
  xlab("")
Run Code Online (Sandbox Code Playgroud)

eip*_*i10 33

以下是如何使标签居中并避免为小百分比绘制标签.数据中的另一个问题是每种颜色都有多个条形部分.相反,在我看来,应该结合给定颜色的所有条形部分.下面的代码使用dplyr而不是plyr设置绘图数据:

library(dplyr)

# Initial data frame   
df <- data.frame(Category, Brand, USD)

# Calculate percentages and label positions
df.summary = df %>% group_by(Brand, Category) %>% 
  summarise(USD = sum(USD)) %>%   # Within each Brand, sum all values in each Category
  mutate(percent = USD/sum(USD),
         pos = cumsum(percent) - 0.5*percent)
Run Code Online (Sandbox Code Playgroud)

要绘制数据,请使用ifelse语句确定是否绘制标签.在这种情况下,我避免为百分比小于7%绘制标签.

ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=percent, fill=Category)) +
  geom_bar(stat='identity',  width = .7, colour="black", lwd=0.1) +
  geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),""),
                y=pos), colour="white") +
  coord_flip() +
  scale_y_continuous(labels = percent_format()) +
  labs(y="", x="")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

更新:使用ggplot2版本2,不再需要计算文本标签的坐标以使它们居中.相反,你可以使用position=position_stack(vjust=0.5).例如:

ggplot(df.summary, aes(x=reorder(Brand, USD, sum), y=percent, fill=Category)) +
  geom_bar(stat="identity", width = .7, colour="black", lwd=0.1) +
  geom_text(aes(label=ifelse(percent >= 0.07, paste0(sprintf("%.0f", percent*100),"%"),"")),
                position=position_stack(vjust=0.5), colour="white") +
  coord_flip() +
  scale_y_continuous(labels = percent_format()) +
  labs(y="", x="")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述