python-3.x 尝试从matplotlib contourf(填充)绘制多边形,但它们似乎不闭合

bttbmeg0  于 2023-04-08  发布在  Python
关注(0)|答案(1)|浏览(135)

我发现了一些高程数据作为矩阵。我用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)

qij5mzcb

qij5mzcb1#

我也遇到过这个问题,可以通过检查contour_set. allkinds来理解。contour_set.allsegs包含包围区域的所有坐标。Thisincludes holes!contour_set.allkinds描述了每个坐标所起的作用(起点、线或终点)。使用填充适用于具有一个孔的对象,但是对于具有多个内部的对象,您需要尝试不同的方法。Contourf使用路径集合:

import matplotlib.pyplot as plt
   import matplotlib.collections as col
   plt.style.use('seaborn-white')
   import numpy as np

   # Generate data
   # Obtained from:https://jakevdp.github.io/PythonDataScienceHandbook/04.04-density-and-contour-plots.html
   def f(x, y):
       return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

   x = np.linspace(0, 5, 50)
   y = np.linspace(0, 5, 40)
   X, Y = np.meshgrid(x, y)
   Z = f(X, Y)

   # Filled contour plot
   fig, ax = plt.subplots(1,2, figsize=(10,5))
   contours = ax[0].contourf(X, Y, Z)

   # Replicate filled contour plot
   for i in range(8):
     paths = contours.collections[i].get_paths()
     fc = contours.axes.collections[i].properties().get('facecolor')
     for p in paths:
       test = col.PathCollection([p], facecolors=fc)
       ax[1].add_collection(test)

   ax[1].set_xlim([0, 5])
   ax[1].set_ylim([0, 5]);

请注意,contourf中的路径集合是按轮廓值分组的。指定特定轮廓可以通过在.get_paths()之后选择它来完成。
See plot

相关问题