【问题标题】:ggplot Stacked bar charts with different number of x-axis categories, but constant bar widthggplot 堆叠条形图,具有不同数量的 x 轴类别,但条形宽度恒定
【发布时间】:2018-04-23 19:40:05
【问题描述】:

我为一份报告生成了多个堆叠条形图。每个图表代表一个不同的区域,并且可能有不同数量的 x 轴类别。为了在不同图表之间获得一致的视觉效果,我希望确保条形的宽度在单独的图表之间是恒定的。我目前无法做到这一点,因为 x 轴类别较少的图表具有更宽的条形。似乎dodgewidth 的组合可能适用于标准条形图,但这不适用于堆叠条形图。请注意,有 100 种可能的 x 轴类别,但实际上每个图表上只显示了 3 到 6 个(最多 6 个)。 有谁知道一种指定恒定条形宽度的方法,然后可以将其应用于所有图表?

对于少于 6 个类别的区域,我的一个想法是在图表的右端添加额外的空类别(使总数达到 6 个),然后以某种方式设置绘图面板宽度,以便剪切这些最后的空占位符离开。我不确定如何实现占位符的切断。

这是一个基本问题的简单示例。

df1 <- data.frame(variable_name = c(rep('var1', 3),rep('var2',4), rep('var3', 3), rep('var4', 4)),
             var_value = c(1,4,2,4,3,6,2,1,6,3,1,3,2,4),
             value_type = c('A','B','C','A','B','C','D','B','C','D','B','D','E','F'))

df2 <- data.frame( variable_name = c(rep('var6',4), rep('var4', 4)),
             var_value = c(4,3,6,2,1,3,2,4),
             value_type = c('A','B','C','D','B','D','E','F'))

ggplot() + 
    geom_col(data = df1,
    aes(x = variable_name, y =var_value,fill = value_type), 
    width = 0.8)

ggplot() + 
    geom_col(data = df2,
    aes(x = variable_name, y =var_value,fill = value_type), 
    width = 0.8)

【问题讨论】:

    标签: r ggplot2 charts


    【解决方案1】:

    最终条形宽度将由您保存绘图的宽度决定,但如果您想在绘图内缩放,只需将width 乘以 x 值的数量除以可能的最大值:

    library(ggplot2)
    
    df1 <- data.frame(variable_name = c(rep('var1', 3), rep('var2', 4), rep('var3', 3), rep('var4', 4)),
                      var_value = c(1,4,2,4,3,6,2,1,6,3,1,3,2,4),
                      value_type = c('A','B','C','A','B','C','D','B','C','D','B','D','E','F'))
    
    df2 <- data.frame(variable_name = c(rep('var6', 4), rep('var4', 4)),
                      var_value = c(4,3,6,2,1,3,2,4),
                      value_type = c('A','B','C','D','B','D','E','F'))
    
    ggplot(df1, aes(x = variable_name, y = var_value, fill = value_type)) + 
        geom_col(width = 0.8 * length(unique(df1$variable_name)) / 6)
    

    ggplot(df2, aes(x = variable_name, y = var_value, fill = value_type)) + 
        geom_col(width = 0.8 * length(unique(df2$variable_name)) / 6)
    

    【讨论】:

    • 太棒了!感谢您提供简单的解决方案。只要条形图在图中按比例缩放,我就应该能够在最终演示文稿中计算出宽度。
    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 2018-12-10
    • 2018-10-21
    • 2019-06-28
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多