如何在matplotlib的imshow输出上正确叠加contour等高线图
问题原因
出现该问题的核心原因是两个绘图函数使用的坐标轴范围不匹配:
plt.imshow()在未指定extent参数时,默认使用数组的行列索引作为坐标轴数值,你传入的Z数组尺寸为300×300,因此imshow生成的底图坐标范围为x∈[0,299]、y∈[0,299]plt.contour()传入的X、Y网格数据范围为x∈[-3,3]、y∈[-3,3],该数值范围远小于底图的坐标范围,因此等高线只会显示在左下角极小区域
解决方法
在调用plt.imshow()时补充extent参数,手动指定图像对应的实际坐标范围即可,extent参数的格式为(x最小值, x最大值, y最小值, y最大值),对应你当前场景的数值就是(-3, 3, -3, 3)。
修改后的完整代码如下:
import numpy as np import matplotlib.pyplot as plt %matplotlib inline def f(x, y): return (1 - x / 2 + x ** 5 + y ** 3 ) * np.exp(-x ** 2 - y ** 2) n = 100 x = np.linspace(-3, 3, 3 * n) y = np.linspace(-3, 3, 3 * n) X, Y = np.meshgrid(x, y) Z = f(X, Y) plt.figure(figsize=(8,6)) # 新增extent参数对齐坐标范围 plt.imshow(Z, interpolation='nearest', cmap=plt.cm.hot, origin='lower', extent=(-3, 3, -3, 3)) contours = plt.contour(X, Y, f(X,Y), 10, colors='black') plt.clabel(contours, inline=1, fontsize=10) plt.xticks([]) plt.yticks([]) plt.savefig('overlay_image.pdf', dpi=72) plt.show()
修改后运行即可实现等高线在imshow底图上的完整正确叠加。
内容的提问来源于stack exchange,提问作者C.B.
相关产品推荐
相关产品推荐

