【问题标题】:Grouped stacked bar graph: issues regarding order of stack, horizontal orientation of graph and label of groups分组堆叠条形图:有关堆叠顺序、图形水平方向和组标签的问题
【发布时间】:2021-06-02 23:32:34
【问题描述】:

我关注了这个问题的答案:Cluster stacked bargraph

创建上图:

使用以下代码:

test  <- data.frame(person=c("8.3. The number of people coming to me \n me, who
                             are who want pizza are too many \n,
                             and too aggressive.", "group 2", "group 3", "5", "6"), 
                    value1=c(100,150,120,100,100),  # Agree   
                    value2=c(25,30,45,100,100) ,    # Neutral
                    value3=c(25,30,45,100,100),     # Disagree
                    value4=c(100,120,150,100,100),  # Agree
                    value5=c(10,12,15,100,100),     # Neutral
                    value6=c(50,40,70,100,100))     # Disagree

library(reshape2) # for melt

melted <- melt(test, "person")

melted$cat <- ''
melted[melted$variable == 'value1' | melted$variable == 'value2' | melted$variable == 'value3',]$cat <- "GP"
melted[melted$variable == 'value4' | melted$variable == 'value5'| melted$variable == 'value6',]$cat <- "LW"
melted$gender <- ''
melted[melted$variable %in% sprintf("value%i",c(1,4)),]$gender <- "Agree"
melted[melted$variable %in% sprintf("value%i",c(2,5)),]$gender <- "Disagree"
melted[melted$variable %in% sprintf("value%i",c(3,6)),]$gender <- "Neutral"



p = ggplot(melted, aes(x = cat, y = value, fill = gender)) 

p + geom_bar(stat = 'identity', position = 'stack') +   facet_grid(~ person) + 
  scale_fill_manual(values = c("orangered","green","dodgerblue2")) + 
  theme(panel.background = element_rect(fill = 'white'))

我的问题是:

如何固定堆栈的顺序以使中立介于同意和中立之间?反正有没有使图表水平,以便我可以有更广阔的空间来适应这个问题?我还希望在每个条形内显示数字,例如,最左边的红色条形应该写有 100。

我在 R 和 Python 中使用了一些 liekert 库,但我无法对条形进行分组,并且还有其他问题。这个 ggplot 图表是我创建所需图表的最接近的图表,因此如果您的答案与我提供的数字完全可重复,我将不胜感激。

【问题讨论】:

    标签: r ggplot2 data-visualization bar-chart visualization


    【解决方案1】:

    为了达到你想要的结果,你可以

    1. 按所需顺序设置因子水平
    2. 利用coord_flip() 制作水平条形图,我稍微更改了 facet_grid 以将条带放在右侧并旋转条带文本标签。
    3. 通过geom_text 添加标签,我将位置设置为position_stack(vjust = .5) 以将标签放在条的中间
    
    
    melted$gender <- factor(melted$gender, c("Agree", "Neutral","Disagree"))
    p = ggplot(melted, aes(x = cat, y = value, fill = gender))
    p + geom_bar(stat = 'identity', position = 'stack') +
      geom_text(aes(label = value), position = position_stack(vjust = .5)) +
      facet_grid(person~.) + 
      scale_fill_manual(values = c("orangered","green","dodgerblue2")) + 
      theme(panel.background = element_rect(fill = 'white'),
            strip.text.y = element_text(angle = 0)) +
      coord_flip()
    

    【讨论】:

    • 这很好用!你知道如何在图表中的数字上添加 % 符号吗?
    • 添加“%”的最简单方法是使用paste0:geom_text(aes(label = paste0(value, "%")), ...)。但是,据我所知,您图中的数字是频率而不是百分比?如果是这种情况,我建议在您的 df 中添加一个包含百分比的列,例如使用 dplyr 你可以做 melted &lt;- group_by(melted, cat, person) %&gt;% mutate(pct = 100 * value / sum(value)) 并在你的情节中使用 pct 而不是 value
    • 哦,我只是放了一些虚拟数据用于堆栈交换,实际数据以%为单位。非常感谢您的帮助!
    猜你喜欢
    • 2016-10-29
    • 2012-05-11
    • 2022-10-13
    • 2017-11-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多