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

如何避免Seaborn FacetGrid中叠加绘图时坐标轴被重新缩放?

问题

我尝试在分类小提琴图(violin plot)上叠加分类带状图(strip plot)。先绘制小提琴图,再绘制带状图后,坐标轴被带状图重新缩放,我希望保留小提琴图的原始坐标轴缩放比例。

小提琴图代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = pd.DataFrame.from_dict({
    'y_violin': list(range(16)),
    'y_strip': [8] * 16,
    'x':   [1, 1, 0, 0] * 4,
    'col': [1, 1, 1, 1, 0, 0, 0, 0] * 2,
    'hue': [1] * 8 + [0] * 8,
})

g = sns.catplot(
    kind = 'violin', data = data,
    x = 'x', y = 'y_violin', col = 'col', hue = 'hue',
    inner = 'points', dodge = False,
)

plt.show()

叠加带状图的代码

for col, ax in g.axes_dict.items():
    sns.stripplot(
        data = data.loc[data.col == col],
        x = 'x', y = 'y_strip',
        jitter = False, legend = False, palette = ['#00FF00'], ax = ax
    )

plt.show()

执行上述代码后,带状图的点位置正确,但图表坐标轴被重新缩放,需要保留小提琴图的原始轴范围。

解决方法

核心思路是先记录小提琴图绘制完成后每个子图的y轴范围,绘制带状图后再将轴范围恢复回去。

修改后的完整代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = pd.DataFrame.from_dict({
    'y_violin': list(range(16)),
    'y_strip': [8] * 16,
    'x':   [1, 1, 0, 0] * 4,
    'col': [1, 1, 1, 1, 0, 0, 0, 0] * 2,
    'hue': [1] * 8 + [0] * 8,
})

# 绘制小提琴图
g = sns.catplot(
    kind = 'violin', data = data,
    x = 'x', y = 'y_violin', col = 'col', hue = 'hue',
    inner = 'points', dodge = False,
)

# 保存每个子图的原始y轴范围
y_ranges = {col: ax.get_ylim() for col, ax in g.axes_dict.items()}

# 叠加带状图并恢复轴范围
for col, ax in g.axes_dict.items():
    sns.stripplot(
        data = data.loc[data.col == col],
        x = 'x', y = 'y_strip',
        jitter = False, legend = False, palette = ['#00FF00'], ax = ax
    )
    # 恢复原始y轴范围
    ax.set_ylim(y_ranges[col])

plt.show()

关键步骤说明

  1. 用ax.get_ylim()获取小提琴图绘制完成后每个子图的y轴上下限,存入字典y_ranges
  2. 绘制完带状图后,调用ax.set_ylim(y_ranges[col])将每个子图的y轴范围恢复到之前记录的值,避免被带状图的数据影响缩放比例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:27:35