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

如何按值对包含多个DataFrame的柱状图进行排序?

解决柱状图顺序不符问题的方案

问题分析

  1. 你调用df1.sort_values(by='price')和df2.sort_values(by='price')后,并没有修改原DataFrame——因为sort_values()默认inplace=False,只会返回排序后的新对象,原数据不会变化。
  2. 两个DataFrame的ticker集合不完整(比如b只在df2,h、f只在df1),直接分别绘图会导致Matplotlib按默认的字母顺序渲染x轴,和你期望的a-b-h-c-d-e-f不符。

修正方案

要实现指定顺序,需要先统一所有ticker的排序规则,再让两个DataFrame都遵循这个顺序:

import matplotlib.pyplot as plt
import pandas as pd

df1 = pd.DataFrame({
    'ticker': ['a', 'c', 'd', 'e', 'f', 'h'],
    'price': [1, 4, 5, 6, 8, 2]})

df2 = pd.DataFrame({
    'ticker': ['a', 'b', 'c', 'd', 'e'],
    'price': [1, 2, 4, 5, 6]})

# 合并两个DataFrame,获取所有唯一ticker并按规则排序
combined = pd.concat([df1, df2]).drop_duplicates(subset='ticker')
# 先按price升序,price相同时按ticker字母排序,得到目标顺序
target_order = combined.sort_values(by=['price', 'ticker'])['ticker'].tolist()

# 让两个原DataFrame按照目标顺序重新排列
df1_sorted = df1.set_index('ticker').reindex(target_order).reset_index()
df2_sorted = df2.set_index('ticker').reindex(target_order).reset_index()

# 绘制柱状图,此时x轴会按目标顺序显示
plt.bar(df1_sorted['ticker'], df1_sorted['price'], label='df1')
plt.bar(df2_sorted['ticker'], df2_sorted['price'], label='df2', alpha=0.6)
plt.legend()
plt.show()

关键说明

  • pd.concat+drop_duplicates确保我们能获取所有出现过的ticker,不会遗漏任何需要显示的项。
  • sort_values(by=['price', 'ticker'])完美匹配你期望的顺序:先按价格从小到大排列,价格相同的(比如b和h都是2)按字母顺序排序。
  • reindex(target_order)强制让两个DataFrame的ticker列遵循目标顺序,绘图时x轴就会严格按照a-b-h-c-d-e-f展示。

内容的提问来源于stack exchange,提问作者student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:22:38