我是最近从Matlab到Python的移民,并且最近与Numpy和Matplotlib合作。我使用Matplotlib的相应轮廓函数,将使用Matlab的轮廓函数的Matlab脚本之一重新编码为Python。我设法在Python中复制了输出,但由于我不知道的原因,contourf曲线并不完全相同。当我在matplotlib中运行contourf-function时,我得到了这个原本不错的图,但是它在顶部和底部的轮廓级别上具有这些尖锐的边缘,不应在此处出现(参见下面的图1,matplotlib-output)。现在,当我将Python中使用的数组导出到Matlab(即用于生成matplotlib-contourf-plot的数据集完全相同)并使用Matlab的轮廓函数时,我得到的输出略有不同,没有那些尖锐的轮廓级边缘(请参见下面的图2,Matlab输出)。我在两个图中使用了相同数量的级别。在图3中,我对相同的数据作了散点图,这表明数据中没有轮廓度图所示的尖锐边缘(我添加了轮廓线仅供参考)。可以通过下面给出的Dropbox链接下载示例数据集。数据集包含三个txt文件:X,Y,Z。它们每个都是500x500数组,可以直接与Contourf()一起使用,即plt.contourf(X,Y,Z,...)。使用的代码是
plt.contourf(X,Y,Z,10, cmap=plt.cm.jet)
plt.contour(X,Y,Z,10,colors='black', linewidths=0.5)
plt.axis('equal')
plt.axis('off')
有人知道为什么会这样吗?我将不胜感激!
干杯
Jussi
以下是我的设置的详细信息:
Python 3.7.0
IPython 6.5.0
matplotlib 2.2.3
Matplotlib输出
Matlab输出
答案 0 :(得分:0)
关于matlab绘图的令人困惑的事情是,其颜色栏显示的色阶比绘图中的实际色阶多得多。因此,您看不到轮廓的实际间隔。
通过选择12个级别而不是11个级别,您将在matplotlib中获得相同的结果。
import numpy as np
import matplotlib.pyplot as plt
X, Y, Z = [np.loadtxt("data/roundcontourdata/{}.txt".format(i)) for i in list("XYZ")]
levels = np.linspace(Z.min(), Z.max(), 12)
cntr = plt.contourf(X,Y,Z,levels, cmap=plt.cm.jet)
plt.contour(X,Y,Z,levels,colors='black', linewidths=0.5)
plt.colorbar(cntr)
plt.axis('equal')
plt.axis('off')
plt.show()
因此,总而言之,两个图都是正确的,并且显示相同的数据。只是自动选择的级别有所不同。可以根据所需的视觉外观选择自定义级别来避免这种情况。