如何按值对包含多个DataFrame的柱状图进行排序?
解决柱状图顺序不符问题的方案
问题分析
- 你调用
df1.sort_values(by='price')和df2.sort_values(by='price')后,并没有修改原DataFrame——因为sort_values()默认inplace=False,只会返回排序后的新对象,原数据不会变化。 - 两个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
相关产品推荐
相关产品推荐

