原则上,等高线不闭合可能有两个原因。
- 首先是简单的视觉外观。白色背景上有白线可能会使外观消失。这种效果显示在数据左侧的第一张图像中。这种效果可以通过对轮廓线着色(第二张图像)来可视化。
除了更改线条或背景颜色之外,您对此无能为力。
- 第二个原因,在数据右侧的前两个图像中可以观察到,线确实没有闭合,因为它们位于数据的边缘。这当然与线条的颜色无关,并且是由于 matplotlib 不知道在数据之外做什么(只有人脑认为这些线条应该闭合,但数据中没有闭合线条的证据)。
为了解决这第二个问题,可以扩展数据或将数据的边缘值分配给最小值,使得线需要闭合。这显示在第三和第四个示例图像中,其中我将数据矩阵的最后一列设置为零。
作为参考,这是生成上述图像的代码。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.backends.backend_pdf import PdfPages
n=90
x = np.arange(n)
y = np.arange(n)
X,Y = np.meshgrid(x,y)
H = (np.sinc((X-70)/50.)**2*np.sinc((Y-50)/50.)**2)*3600
H[:, :50] = np.zeros((n,50))
grid_min = 10
binsize = H.max()/8.
fig, (ax, ax2, ax3, ax4) = plt.subplots(ncols=4, figsize=(12,5))
plt.subplots_adjust(left=0.03, right=0.97, wspace=0.03)
levels=np.arange(grid_min, np.ceil(H.max()), binsize)
for a in (ax, ax2, ax3, ax4):
a.contourf(X,Y,H, levels=levels, cmap='viridis')
a.set_xlim([40,100])
a.yaxis.set_visible(False)
a.xaxis.set_visible(False)
ax.set_title("Open white lines")
ax.text(.076, .5, "Closed white line ", rotation=90, transform=ax.transAxes, va="center")
ax.text(.86, .5, "Open white lines", rotation=-90, transform=ax.transAxes, va="center")
ax.contour(X,Y,H, levels=levels, linewidths=3, linestyles='-', colors=['w' for i in range(len(levels))])
ax2.set_title("Open Colored lines")
ax2.text(.06, .5, "Closed colored lines", rotation=90, transform=ax2.transAxes, va="center")
ax2.text(.86, .5, "Open colored lines", rotation=-90, transform=ax2.transAxes, va="center")
ax2.contour(X,Y,H, levels=levels, linewidths=3, linestyles='-', cmap="jet")
# Setting the last column of data to zero in order to close the lines
H[:, n-1] = np.zeros(n)
ax3.set_title("Closed White lines")
ax3.text(.076, .5, "Closed white lines", rotation=90, transform=ax3.transAxes, va="center")
ax3.text(.86, .5, "Closed white lines", rotation=-90, transform=ax3.transAxes, va="center")
ax3.contour(X,Y,H, levels=levels, linewidths=3, linestyles='-', colors=['w' for i in range(len(levels))])
ax4.set_title("Closed Colored lines")
ax4.text(.06, .5, "Closed colored lines", rotation=90, transform=ax4.transAxes, va="center")
ax4.text(.86, .5, "Closed colored lines", rotation=-90, transform=ax4.transAxes, va="center")
ax4.contour(X,Y,H, levels=levels, linewidths=3, linestyles='-', cmap="jet")
plt.show()