如何使用siuba和plotnine实现按多个变量对图表排序
多变量排序图表的siuba+plotnine实现方案
原有代码问题
你需要实现先按am、再按mpg对柱状图的车型轴排序,原有代码存在两个核心问题:
- 仅使用
fct_reorder(_.model, _.am)按单变量排序,同am分组内的车型不会按mpg自动排序 - 虽然提前使用了
arrange(_.am, _.mpg)对数据集排序,但没有将该顺序同步到model的因子水平中
优化方案
方案1:基于预排序的因子转换(更简便)
因为你已经提前按目标顺序完成了数据集排序,直接使用fct_inorder将model列转换为按当前数据行顺序设置水平的因子即可,无需额外计算排序权重。
修改后完整代码:
( mtcars >> arrange(_.am, _.mpg) >> mutate(model = fct_inorder(_.model)) >> ggplot(aes(y="mpg", x="model", fill='factor(am)')) + geom_col() + labs(fill = "Automatic/Manual Transmission") + coord_flip() )
如果需要同am分组内按mpg降序排列,仅需把arrange语句改为arrange(_.am, -_.mpg)即可。
方案2:基于组合权重的因子排序
如果你不想依赖数据集的预排序顺序,也可以通过构造组合排序权重实现多变量排序:
( mtcars >> mutate(model = fct_reorder(_.model, _.am * 100 + _.mpg)) >> ggplot(aes(y="mpg", x="model", fill='factor(am)')) + geom_col() + labs(fill = "Automatic/Manual Transmission") + coord_flip() )
这里am取值为0/1,乘以100后权重远高于mpg的取值范围(10~34),因此排序时会优先按am分组,同组内按mpg升序排列。
参考效果

内容的提问来源于stack exchange,提问作者African Yeti
相关产品推荐
相关产品推荐

