如何在ggplot多变量柱状图中重新排序填充系列?
调整ggplot分组柱状图的填充系列自定义顺序
我用以下代码在ggplot中绘制柱状图,以location为x轴,direction为填充系列:
ggplot(bp, aes(location, avg, fill=direction)) + geom_bar(stat="identity", position = "dodge")
得到的图表如下:
但我希望每组内的柱子顺序为W在左、E在右。我知道ggplot中有reorder()函数,但不清楚如何针对以下场景使用:
- 调整填充系列而非x轴值的顺序
- 对分类变量进行自定义排序而非按数值升降排序
数据如下:
bp <- data.frame( avg = c( 0.290295409135636, 0.662679922241013, 0.0157451189744425, 0.458147570483339, 0.281818457065378, 0.821172852462277, 0.260305525502705, 0.0588071699123448, 0.208385246183277 ), location = rep(c("Narraguagus", "Bluehill", "Jericho"), 3), direction = rep(c("R", "W", "E"), each = 3L) )
解决方案:自定义因子水平顺序
reorder()是基于数值对分类变量排序的,不适合自定义顺序的场景。要调整填充系列的顺序,直接把direction转换成指定顺序的因子即可:
修改数据的因子水平
给direction列设置自定义的因子水平顺序,按你想要的柱子排列顺序指定levels参数:bp$direction <- factor(bp$direction, levels = c("W", "E", "R"))这里把顺序设为
W→E→R,绘图时每组内的柱子就会按这个顺序排列。重新绘制图表
使用修改后的数据绘图,就能得到你想要的柱子顺序:ggplot(bp, aes(location, avg, fill=direction)) + geom_bar(stat="identity", position = "dodge")
原理说明
ggplot默认按照分类变量的因子水平顺序来排列元素。当你把字符型的direction转为因子并指定levels时,就强制设定了它的显示优先级,从而实现自定义的柱子排序。
内容的提问来源于stack exchange,提问作者rose_t
相关产品推荐
相关产品推荐

