You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:09:03