解决matplotlib中pcolor绘制numpy数组出现镜像的问题
解决plt.pcolor显示数组镜像的问题
这个问题其实是因为plt.pcolor()默认的坐标轴方向和我们对数组行/列的直观认知不一致导致的:numpy数组的第一行对应图像的顶部,但pcolor默认把数组的第一行放在绘图区域的底部,所以就出现了镜像效果。
有几种简单的方法可以修正这个问题:
方法1:使用origin='upper'参数
这是最直接的解决方案,在调用pcolor的时候加上origin='upper'参数,告诉matplotlib把数组的第一行放在图像的顶部:
import numpy as np import matplotlib.pyplot as plt array = np.eye(5) plt.pcolor(array, cmap="Greys", edgecolors="Grey", linewidths=1, origin='upper') plt.show()
这样绘制出来的结果就和数组的实际顺序一致了,np.eye(5)的主对角线会从左上角延伸到右下角,完全符合我们的预期。
方法2:翻转数组本身
如果你不想修改绘图参数,也可以先对数组进行垂直翻转,用np.flipud()函数调整数组顺序来匹配pcolor默认的绘图方向:
import numpy as np import matplotlib.pyplot as plt array = np.eye(5) array_flipped = np.flipud(array) plt.pcolor(array_flipped, cmap="Greys", edgecolors="Grey", linewidths=1) plt.show()
这个方法同样能得到正确的显示效果。
额外小提示
顺便提一句,plt.imshow()默认就是origin='upper'的配置,所以用imshow绘制数组时默认不会有镜像问题,但pcolor(以及pcolormesh)因为历史设计原因默认是origin='lower',这就是你遇到镜像问题的核心原因。
内容的提问来源于stack exchange,提问作者VanillaChoco441




