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

如何在Seaborn点图中截断Y轴以展示不同尺度的数据

如何在Seaborn点图中截断Y轴以展示不同尺度的数据

嘿,我完全懂你现在的困扰——那条VC的蓝线数值太高,直接把其他线条的细节都压没了,根本没法看清它们的变化规律。别发愁,咱们可以通过截断Y轴的方式来解决这个问题,把Y轴拆成上下两个部分:一个用来放大展示低数值区域(其他线条的部分),另一个用来保留高数值区域(VC线的上部),这样两边的趋势都能看得清清楚楚。

下面给你一步步演示具体的实现方法:

1. 准备工作

首先确保你已经导入了需要的库:

import matplotlib.pyplot as plt
import seaborn as sns

2. 创建截断式的子图布局

我们用gridspec来创建上下两个子图,给上部子图(放高数值)设置更小的高度比例,让整体看起来更协调:

# 设置画布大小,创建子图布局
fig = plt.figure(figsize=(10, 6))
# 2行1列的布局,上部高度占1份,下部占3份,间距设小一点让它们连起来
gs = fig.add_gridspec(2, 1, height_ratios=[1, 3], hspace=0.05)

# 初始化上下两个子图
ax_top = fig.add_subplot(gs[0])  # 上部:展示VC线的高数值部分(>10000)
ax_bottom = fig.add_subplot(gs[1])  # 下部:放大展示其他线条的低数值部分(0-5000)

3. 在两个子图分别绘制点图

分别给两个子图设置对应的Y轴范围,这样就能精准展示各自的区域:

# 绘制上部子图,锁定Y轴范围到10000到数据最大值
sns.pointplot(ax=ax_top, data=Dataframe, x="Month", y="CovDist", hue='Tag')
ax_top.set_ylim(10000, Dataframe['CovDist'].max())
# 隐藏上部子图的X轴标签和刻度,避免重复显示
ax_top.set_xlabel('')
ax_top.set_xticklabels([])

# 绘制下部子图,锁定Y轴范围到0-5000
sns.pointplot(ax=ax_bottom, data=Dataframe, x="Month", y="CovDist", hue='Tag')
ax_bottom.set_ylim(0, 5000)

4. 添加截断标记(优化视觉效果)

为了让读者一眼看出Y轴是截断的,我们在两个子图的连接处加上斜线标记:

d = .015  # 控制斜线的长度和角度
kwargs = dict(transform=ax_top.transAxes, color='black', clip_on=False)
# 上部子图的底部斜线
ax_top.plot((-d, +d), (-d, +d), **kwargs)
ax_top.plot((1 - d, 1 + d), (-d, +d), **kwargs)

# 转换到下部子图的坐标系,绘制顶部斜线
kwargs.update(transform=ax_bottom.transAxes)
ax_bottom.plot((-d, +d), (1 - d, 1 + d), **kwargs)
ax_bottom.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)

5. 优化图例(可选)

因为两个子图都绘制了hue,图例会重复,我们可以去掉上部的图例,把下部的图例调整到合适位置:

# 移除上部子图的图例
ax_top.legend_.remove()
# 把下部子图的图例移到右上角(你可以根据需求调整位置)
ax_bottom.legend(loc='upper right')

最后执行plt.show()就能看到效果啦!这样既保留了VC线的高数值趋势,又能清晰观察到其他线条的细节变化,完美解决了你的问题。

备注:内容来源于stack exchange,提问作者toms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:42:42