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

R 如何将堆叠百分比条形图标签居中,r,ggplot2,bar-chart,labels,R,Ggplot2,Bar Chart,Labels,我正在尝试使用ggplot2绘制尼斯堆叠百分比条形图。我读了一些材料,几乎能画出我想要的东西。此外,我附上了材料,它可能在一个地方有用: 我的问题是我不能把标签>代码>我想要的——在栏的中间。 您可以在上图中看到问题所在-标签看起来很满,而且彼此重叠 我现在正在寻找的是: 如何在条(区域)中间放置标签 如何绘制不是所有标签,而是例如大于10%的标签 如何解决重叠问题 对于q1.@MikeWise建议的可能性。然而,我仍然不能处理这个问题 另外,我附上了一个可复制的例子,我是如何绘制这个gr

我正在尝试使用
ggplot2
绘制尼斯
堆叠百分比条形图。我读了一些材料,几乎能画出我想要的东西。此外,我附上了材料,它可能在一个地方有用:

我的问题是我不能把<代码>标签>代码>我想要的——在栏的中间。 您可以在上图中看到问题所在-标签看起来很满,而且彼此重叠

我现在正在寻找的是:

  • 如何在条(区域)中间放置标签

  • 如何绘制不是所有标签,而是例如大于10%的标签

  • 如何解决重叠问题

  • 对于
    q1.
    @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("")
    
    library('plyr')
    库('ggplot2')
    库('比例')
    种子集(1992)
    n=68
    
    类别以下是如何将标签居中并避免打印小百分比的标签。数据中的另一个问题是,每种颜色都有多个条形图。相反,在我看来,给定颜色的所有条形部分都应该组合在一起。下面的代码使用
    dplyr
    而不是
    plyr
    来设置绘图数据:

    library(dplyr)
    
    # Initial data frame   
    df <- data.frame(Category, Brand, USD)
    
    # Calculate percentages
    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
    ):

    然后使用
    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="")
    

    我遵循了这个示例,找到了如何为简单的堆叠条形图添加漂亮标签的方法。我想它也可能有用

    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( pos = cumsum(USD)-0.5*USD)
    
    ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=USD, fill=Category)) +
      geom_bar(stat='identity',  width = .7, colour="black", lwd=0.1) +
      geom_text(aes(label=ifelse(USD>100,round(USD,0),""),
                    y=pos), colour="white") +
      coord_flip()+
      labs(y="", x="")
    
    df%分组依据(品牌、类别)%>%
    总结(美元=总和(美元))%>%#在每个品牌中,总结每个类别中的所有价值
    突变(pos=累计金额(美元)-0.5*USD)
    ggplot(df.summary,aes(x=重新订购(品牌、美元、功能(x)+总和(x)),y=美元,填充=类别))+
    几何图形条(stat='identity',width=.7,color='black',lwd=0.1)+
    几何图形文本(aes(标签=ifelse(美元>100,圆形(美元,0),“”),
    y=位置),颜色=“白色”)+
    coord_flip()+
    实验室(y=“”,x=“”)
    

    附加问题。是否有一种简单的方法可以在框中打印标签<代码>几何图形标签
    功能似乎不起作用。不要太帮忙。这条路看起来真的很复杂,关于如何通过新构建实现这一点,有很多想法吗?这个页面上的最后一个“答案”显示了我遇到的一个类似问题,标签看起来是按相反的顺序放置的。我已经成功地使用这种方法好几个月了。
    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="")
    
    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( pos = cumsum(USD)-0.5*USD)
    
    ggplot(df.summary, aes(x=reorder(Brand,USD,function(x)+sum(x)), y=USD, fill=Category)) +
      geom_bar(stat='identity',  width = .7, colour="black", lwd=0.1) +
      geom_text(aes(label=ifelse(USD>100,round(USD,0),""),
                    y=pos), colour="white") +
      coord_flip()+
      labs(y="", x="")