如何绘制堆叠条形图,其中每个条形图中的顺序基于一列,每个级别的颜色基于另一个级别?

时间:2018-06-13 18:41:22

标签: r ggplot2 bar-chart

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

我读了一个csv文件,数据框有以下几列:

  • 方法(字符)
  • 财产(字符)
  • 订单(整数)
  • 成功(双倍):成功是轴“y”,方法是轴“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)

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

期望的结果

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

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

Excel Graph Demo

有没有办法策划这个?我感谢您的帮助。

我也忘了写我正在使用ggplot2,但我知道代码很简单。

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

2 个答案:

答案 0 :(得分:0)

因为您需要为方法的每个组更改 Property 的因子级别排序,请考虑通过 Method <迭代地构建带有geom_bar()的栏/ em>组。您可以使用by按列对数据框进行子集设置。下面将原始输出与调整后的输出进行比较,您可以在其中看到 MF RF 交换颜色。

<强>原始

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

Original Plot Output

调整后的输出

# 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

Adjusted Plot Output

此外,如果您希望使用与Excel相同的设置,并在底部使用第一项,请在rev级别调用中使用反向向量方法factor,所有人都在by内:

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

Adjusted Plot Output with Reversal

答案 1 :(得分:0)

您可以使用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) )

enter image description here