我正在尝试绘制一个堆积条,其中级别的顺序由列定义,颜色由另一个定义。
我读了一个csv文件,数据框有以下几列:
数据
我的数据框的一个子集是:
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条颜色如下:蓝色,黄色,棕色,蓝色和绿色)
有没有办法策划这个?我感谢您的帮助。
我也忘了写我正在使用ggplot2
,但我知道代码很简单。
p <- ggplot(REF01, aes(x=Method, y=Success)) +
geom_bar(aes(fill = Property) , stat = "identity")
答案 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"
调整后的输出
# 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相同的设置,并在底部使用第一项,请在rev
的级别调用中使用反向向量方法factor
,所有人都在by
内:
sub <- within(sub,
Property <- factor(Property,
levels=rev(unique(Property)),
ordered=FALSE))
答案 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) )