我发现了一些高程数据作为矩阵。我用matplotlib
绘制了数据contourf
图。这看起来像图的左上角。我想稍后在代码的其他部分重用这些等高线。在某些时候,我想一次只重绘一个给定的等高线。为此,我使用简单的plt.fill
函数并从contours segments
中获取多边形。右上角是第一个轮廓,左下角是第二个轮廓,右下角是第三个...等等。现在你看到问题了。似乎从plt.contourf
输出的多边形没有闭合。或者发生了其他事情,但我不确定是什么。你知道我该怎么解决吗?
我使用的代码如下:
import matplotlib.pyplot as plt
import matplotlib.cm as cm
%matplotlib inline
im = Image.open('someImage.tif')
imTif = np.array(im)
im_df = pd.DataFrame(imTif)
在这里我处理了一点我的图像,但这并不重要。最后我只是有一个数字矩阵
lenY, lenX = im_df.shape
fig1 = plt.figure()
ax1 = fig1.add_subplot(2,2,1)
contour_set = ax1.contourf(np.arange(0,lenX), -np.arange(0,lenY), im_df, cmap='terrain', \
levels=levels)
plt.colorbar(contour_set)
xi, xf = ax1.get_xlim()
yi, yf = ax1.get_ylim()
cnorm = plt.Normalize(vmin=levels[0],vmax=levels[-1])
clevels = [levels[0]] + list(0.5*(levels[1:]+levels[:-1])) + [levels[-1]]
colors = plt.cm.terrain(cnorm(clevels))
segments = contour_set.allsegs
for contour_nb in range(0,3):
ax = fig1.add_subplot(2,2,2+contour_nb)
for polygon in segments[contour_nb]:
xs, ys = zip(*polygon)
ax.fill(xs,ys,color=colors[contour_nb+1])
ax.set_xlim(xi, xf)
ax.set_ylim(yi, yf)
1条答案
按热度按时间qij5mzcb1#
我也遇到过这个问题,可以通过检查contour_set. allkinds来理解。contour_set.allsegs包含包围区域的所有坐标。Thisincludes holes!contour_set.allkinds描述了每个坐标所起的作用(起点、线或终点)。使用填充适用于具有一个孔的对象,但是对于具有多个内部的对象,您需要尝试不同的方法。Contourf使用路径集合:
请注意,contourf中的路径集合是按轮廓值分组的。指定特定轮廓可以通过在.get_paths()之后选择它来完成。
See plot