gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:19:24 24 4
gpt4 key购买 nike

我正在尝试绘制漂亮的图 stacked percent barchart使用 ggplot2 .我已经阅读了一些 Material 并且几乎设法绘制出我想要的图。另外,我附上了 Material ,它可能在一个地方有用:

How do I label a stacked bar chart in ggplot2 without creating a summary data frame?

Create stacked barplot where each stack is scaled to sum to 100%

R stacked percentage bar plot with percentage of binary factor and labels (with ggplot)

我的问题是我不能放置 labels我想要的地方 - 在酒吧的中间。 enter image description here

您可以在上图中看到问题 - 标签看起来很糟糕并且相互重叠。

我现在正在寻找的是:

  • 如何在条形(区域)中间放置标签
  • 如何绘制并非所有标签,但例如大于 10% 的标签?
  • 如何解决重叠问题?

  • 对于 Q 1. @MikeWise 建议可能 solution .但是,我仍然无法处理这个问题。

    另外,我附上了可重现的例子,我是如何绘制这个图形的。
    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("")

    最佳答案

    以下是如何将标签居中并避免为小百分比绘制标签。数据中的另一个问题是每种颜色都有多个条形部分。相反,在我看来,给定颜色的所有条形部分都应该组合在一起。下面的代码使用 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))

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

    enter image description here

    对于旧版本,我们需要计算位置。 (同上,但多了一行定义 pos ):
    # 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)

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

    enter image description here

    关于r - 如何将堆积百分比条形图标签居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903368/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com