Seaborn双侧条形图未正确关联y轴Price值问题
问题原因
你遇到的问题核心在于Seaborn的barplot默认会将y轴变量(这里是Price)当作分类变量处理:
第一次绘制Side=1的数据时,Seaborn会按该组Price值的出现顺序,为每个Price分配固定的y轴位置;第二次绘制Side=0的数据时,由于两组Price值完全不重叠,Seaborn不会重新计算y轴的位置映射,而是直接复用第一次生成的分类位置,导致Side=0的条形被错误地叠加在Side=1的Price位置上,而非对应自身实际的Price值。
从你提供的条形图能看到:红色条形(Side=0)没有出现在它对应的0.75960.7605区间,而是和蓝色条形(Side=1)的0.75860.7595区间重叠。
解决方案
下面提供两种实用的解决方法:
方法1:用Matplotlib直接绘制(推荐,适配连续Price值)
由于你的Price是连续数值,直接用Matplotlib的barh可以精准映射y轴位置,避免分类变量的位置混乱:
import pandas as pd import matplotlib.pyplot as plt # 假设你的数据已经存入DataFrame d中 f, ax = plt.subplots() # Side=1的条形向左延伸,将Size取反 side1_data = d[d.Side == 1] ax.barh(side1_data['Price'], -side1_data['Size'], color='b', label='Side=1') # Side=0的条形向右延伸 side0_data = d[d.Side == 0] ax.barh(side0_data['Price'], side0_data['Size'], color='r', label='Side=0') # 设置坐标轴和图例 ax.set_xlabel('Size') ax.set_ylabel('Price') ax.legend() plt.show()
方法2:统一Seaborn的y轴分类顺序
如果坚持使用Seaborn,通过指定order参数统一所有Price值的排序,确保两组数据的条形对应正确的y轴位置:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 假设你的数据已经存入DataFrame d中 # 获取所有唯一Price值并排序,作为统一的y轴分类顺序 all_prices = sorted(d['Price'].unique()) f, ax = plt.subplots() sns.set_color_codes('muted') # 绘制Side=1,Size取反让条形向左 sns.barplot( data=d[d.Side == 1], x=d[d.Side == 1]['Size'] * -1, y='Price', color='b', orient='h', order=all_prices ) # 绘制Side=0 sns.barplot( data=d[d.Side == 0], x='Size', y='Price', color='r', orient='h', order=all_prices ) ax.set_xlabel('Size') plt.show()
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

