对ggplot2堆积条形图进行故障排除

时间:2016-07-22 10:06:32

标签: r graphics ggplot2 bar-chart

我试图创建一个堆叠的身份条形图,但ggplot2一直将我的数据混为一谈。

它不是为每个扇区提供每个相应类别的堆积图,而是将directindirect.downindirect.up类别聚合在一起。

test.df = data.frame(scenario=(c("s1", "s1", "s1", "s2", "s2", "s2", "s3", "s3", "s3",
                             "s1", "s1", "s1", "s2", "s2", "s2", "s3", "s3", "s3",
                             "s1", "s1", "s1", "s2", "s2", "s2", "s3", "s3", "s3")),
              sector=(c("Agriculture", "Manufacturing", "Services", "Agriculture", "Manufacturing", "Services", "Agriculture", "Manufacturing", "Services",
                        "Agriculture", "Manufacturing", "Services", "Agriculture", "Manufacturing", "Services", "Agriculture", "Manufacturing", "Services",
                        "Agriculture", "Manufacturing", "Services", "Agriculture", "Manufacturing", "Services", "Agriculture", "Manufacturing", "Services" )),
              loss=(runif(27,0,1000)), shock=(c("direct", "indirect.up", "indirect.down","direct", "indirect.up", "indirect.down","direct", "indirect.up", "indirect.down",
                        "direct", "indirect.up", "indirect.down","direct", "indirect.up", "indirect.down","direct", "indirect.up", "indirect.down",
                        "direct", "indirect.up", "indirect.down","direct", "indirect.up", "indirect.down","direct", "indirect.up", "indirect.down")))

library(ggplot2)

ggplot(test.df, aes(x=sector, y=loss)) + geom_bar(stat = "identity", aes(fill=shock))  + facet_wrap(~ scenario) + coord_flip()

我希望它看起来像每个部门的冲击如何叠加:

enter image description here

1 个答案:

答案 0 :(得分:1)

这是因为在您的示例数据中,每个sector只有一种shock与之关联。

table(test.df$sector, test.df$shock)

#              direct indirect.down indirect.up
# Agriculture        9             0           0
# Manufacturing      0             0           9
# Services           0             9           0

添加一些数据以在sectorshock之间创建更多关联:

df2 <- test.df

df2$shock[df2$shock == "indirect.down"] <- "indirect.up"
df2$shock[df2$shock == "direct"] <- "indirect.down"

test.df <- rbind(test.df, df2)

table(test.df$sector, test.df$shock)

#               direct indirect.down indirect.up
# Agriculture        9             9           0
# Manufacturing      0             0          18
# Services           0             9           9

立即测试您的代码:

library(ggplot2)

ggplot(test.df, aes(x=sector, y=loss)) +
 geom_bar(stat = "identity", aes(fill=shock))  +
 facet_wrap(~ scenario) + coord_flip()

enter image description here