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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:41:13