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

使用plt.imshow应用滤波器时的坐标轴缩放异常问题

解决二维直方图高斯滤波后y轴缩放异常的问题

我来帮你分析下这个问题哈~

问题根源

你的自有数据里,x轴的范围是29000到35000(跨度6000),而y轴范围只有0到10(跨度10),两者的数值跨度差距极大。但plt.imshow()默认会使用aspect='equal'(等宽高比)来渲染图像,这就导致y轴被压缩得几乎看不见——而你用随机数据测试时,x和y的范围都是0-80(跨度一致),所以不会出现这个问题。

两种解决方案

方案1:给imshow添加aspect='auto'参数

直接修改imshow的参数,让matplotlib自动调整轴的宽高比来适配数据范围:

import matplotlib.pyplot as plt
import numpy as np

x = [29160, 30420, 30840, 31680, 31920, 32040, 33000, 33300, 33480, 34200]
y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
fig, ax = plt.subplots()
plt.scatter(x,y)
# 重命名变量避免和原x/y混淆
z, x_edges, y_edges, p = plt.hist2d(x,y, bins = 40, range = np.array([(29000, 35000), (0, 10)]))
plt.imshow(z.T, interpolation = 'gaussian', origin = 'lower', cmap = 'jet', 
           extent = [29000,35000,0,10], aspect='auto')
plt.colorbar()  # 添加上色条更直观
plt.show()

方案2:用pcolormesh替代imshow(更推荐)

imshow本质是为像素类的等比例图像设计的,而pcolormesh专门用于绘制非等比例的二维网格数据,适配性更好。我们可以用它搭配shading='gouraud'实现类似高斯平滑的效果:

import matplotlib.pyplot as plt
import numpy as np

x = [29160, 30420, 30840, 31680, 31920, 32040, 33000, 33300, 33480, 34200]
y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
fig, ax = plt.subplots()
plt.scatter(x,y)
z, x_edges, y_edges, p = plt.hist2d(x,y, bins = 40, range = np.array([(29000, 35000), (0, 10)]))
# 直接用直方图的边作为坐标,无需手动设置extent
plt.pcolormesh(x_edges, y_edges, z.T, cmap='jet', shading='gouraud')
plt.colorbar()
plt.show()

这样修改后,y轴就会正常显示,同时高斯平滑的效果也能保留啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:32