【问题标题】:How to plot a stacked bar where the order in each bar is based on a column and the color of each level is based on another?如何绘制一个堆叠条,其中每个条中的顺序基于列,每个级别的颜色基于另一个?
【发布时间】:2018-06-13 18:41:22
【问题描述】:

我正在尝试绘制一个堆叠条,其中级别的顺序由一列定义,颜色由另一列定义。

我读取了一个 csv 文件,数据框包含以下列:

  • 方法(字符)
  • 属性(字符)
  • 顺序(整数)
  • Success (double):Success 是“y”轴,Method 是“x”轴。

数据

我的数据框的一个子集是:

Method <- c("MF", "MF", "MF", "MF", "MF", "MF", "RF", "RF", "RF", "RF", "RF", "RF")
Property <- c("P1","P2","P3","P6","P5","P7","P1","P6","P2","P5","P4","P7") 
Order <- c(1,2,3,4,5,6,1,2,3,4,5,6)
Success <- c(87.612,4.583,0.286,6.122,0.788,0.573,87.612,6.409,4.332,0.895,0.0,0.573)

REF01 <- data.frame(Method, Property, Order, Success)

Success 是 Order 列之后的增量列。例如,前 3 个属性(P1、P6 和 P2)的方法 RF 的成功率为 (87.612 + 6.409 + 4.332)。

期望的结果

我需要根据 Order 列为每个 Method 堆叠 Success,但我想根据 Property 进行着色 列。我在 Excel 中手动绘制了我希望在这个小示例中看到的内容。

下图显示蓝色(P1)是这两种方法的第一个属性。每种方法的第二个属性都不同。 P2(棕色)是MF的第二个,RF的第三个,而P6(黄色)是RF的第二个,MF的第四个。因此,MFbar 颜色如下:蓝色、棕色、灰色(RF 中不存在的属性、黄色和深蓝色。RF 条颜色如下:蓝色、黄色、棕色、蓝色和绿色)

有没有办法绘制这个?我感谢您的帮助。

我也忘了写我用的是ggplot2,但我知道代码很简单。

p <- ggplot(REF01, aes(x=Method, y=Success)) +  
       geom_bar(aes(fill = Property) , stat = "identity")

【问题讨论】:

    标签: r ggplot2 bar-chart


    【解决方案1】:

    您可以使用group 美学来控制堆叠顺序为shown in this answer

    ggplot(df, aes(x = Method, y = Success, group = Order)) +  
        geom_col(aes(fill = Property) )
    

    注意堆叠条的默认顺序是从上到下。要反转,我们可以使用position = position_stack(reverse = TRUE)

    ggplot(df, aes(x = Method, y = Success, group = Order)) +  
        geom_col(aes(fill = Property), position = position_stack(reverse = TRUE) )
    

    【讨论】:

    • 两种解决方案(aosmith 和 Parfait)都运行良好。我相信这个答案中的链接非常有帮助。谢谢你们。
    【解决方案2】:

    因为您需要为每组Method更改Property的因子级别排序,请考虑通过Method迭代使用geom_bar()构建条形图> 组。您可以使用 by 按列对数据框进行子集化。下面将原始输出与调整后的输出进行比较,您可以看到 MFRF 交换颜色。

    原创

    # FULL DATASET PLOT
    ggplot(REF01, aes(x=Method, y=Success, fill=Property)) +  
      geom_bar(stat = "identity"
    

    调整后的输出

    # ORDER DATAFRAME BY METHOD AND ORDER
    REF01 <- with(REF01, REF01[order(Method,Order),])
    
    # ITERATIVELY REMOVE DEFAULT ORDER BY NAME AND RETURN LIST OF geom_bar
    bar_list <-  by(REF01, REF01$Method, function(sub) {
        sub <- within(sub, 
                      Property <- factor(Property, 
                                         levels=unique(Property),
                                         ordered=FALSE))
        geom_bar(stat = "identity", data=sub)        
    })
    
    # PLOT WITH LIST
    ggplot(sub, aes(x=Method, y=Success, fill=Property)) + 
      bar_list
    

    此外,如果您想要与 Excel 相同的设置,底部的第一个项目,请在 factorlevels 调用中使用反向向量方法 rev,所有仍在 @ 987654333@:

    sub <- within(sub, 
                  Property <- factor(Property, 
                                     levels=rev(unique(Property)),
                                     ordered=FALSE))
    

    【讨论】:

      猜你喜欢
      • 2014-05-11
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多