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

Seaborn绘制DataFrame时设置轴交点(0,0)致X轴消失的解决方法

问题:Seaborn绘制DataFrame时调整轴位置导致X轴消失

我用Seaborn绘制Pandas DataFrame数据,想让X轴与Y轴在(0,0)处相交,但执行ax.spines['bottom'].set_position(('data',0))后X轴直接消失了。

复现代码

创建Pandas DataFrame

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

# 定义缺失的变量
num_algos = 3
num_seeds = 2
num_iterations = 10

col_names =  ['algorithm', 'seed', 'iteration', 'performance']
df = pd.DataFrame(columns = col_names)

df['algorithm'] = [f'Algorithm {i}' for i in range(num_algos)
                                    for _ in range(num_seeds)
                                    for _ in range(num_iterations)]
df['seed'] = [i for i in range(num_seeds)
                for _ in range(num_iterations)] * num_algos

iters = num_algos * num_seeds
df['iteration'] = np.linspace(0, 1000, num_iterations).tolist() * iters

df['performance'] = np.random.rand(iters * num_iterations)

正常绘制代码(轴位置未调整)

ax = sns.lineplot(data = df,
                  x ='iteration',
                  y = 'performance',
                  hue = 'algorithm',
                  style = 'algorithm'
                  )
plt.show()

调整轴位置后X轴消失的代码

ax = sns.lineplot(data = df,
                  x ='iteration',
                  y = 'performance',
                  hue = 'algorithm',
                  style = 'algorithm'
                  )
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data',0))
plt.show()
原因分析

问题核心是X轴的显示范围不包含Y=0的位置:

  • performance列由np.random.rand()生成,取值范围是(0,1),Y轴实际范围在0到1之间;但X轴的iteration取值是0到1000。
  • 执行ax.spines['bottom'].set_position(('data',0))时,是把X轴(底部脊柱)移动到Y轴数值为0的位置,但这个位置不在X轴的可视显示范围内,导致X轴脊柱被移出图表区域,看起来像消失了。
解决方法

要实现轴在(0,0)相交,需正确设置脊柱位置,同时确保交叉点处于图表可视范围内:

方法1:精准设置脊柱交叉位置

将Y轴脊柱移到X=0处,X轴脊柱移到Y=0处,同时手动确保Y轴包含0值:

ax = sns.lineplot(data = df,
                  x ='iteration',
                  y = 'performance',
                  hue = 'algorithm',
                  style = 'algorithm'
                  )
# 左侧脊柱(Y轴)移到X=0的位置
ax.spines['left'].set_position(('data', 0))
# 底部脊柱(X轴)移到Y=0的位置
ax.spines['bottom'].set_position(('data', 0))

# 隐藏冗余的顶部、右侧脊柱
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 强制Y轴从0开始,确保交叉点在可视区域
ax.set_ylim(bottom=0)

plt.show()

方法2:用zero参数简化设置

Matplotlib提供'zero'参数,可直接让脊柱与另一轴的零点对齐:

ax = sns.lineplot(data = df,
                  x ='iteration',
                  y = 'performance',
                  hue = 'algorithm',
                  style = 'algorithm'
                  )
# 左侧脊柱与X轴零点对齐,底部脊柱与Y轴零点对齐
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')

# 隐藏顶部、右侧脊柱
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 确保Y轴包含0值
ax.set_ylim(bottom=0)

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:52:44