使用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
相关产品推荐
相关产品推荐

