【问题标题】:Non-closed contours in matplotlib?matplotlib中的非闭合轮廓?
【发布时间】:2015-06-04 19:00:51
【问题描述】:

在 GIS 预处理器中实现(精彩的 matplotlib)轮廓绘制时,结果有些不理想 [参见附图以获取参考]。

结果不是理想地显示折线段(橙色圆圈区域),而是封闭的多边形环(绿色突出显示的路径)。

我对游戏逻辑的最佳推断;在所附图像中从左到右,轮廓级别正在减少。闭合的循环表明 matplotlib.pyplot.contours() 正在合并所述级别范围内的所有值 - 因此是闭合循环?

我们的目标是让这些大致垂直的轮廓水平线在所述形状的边界处被剪掉。考虑到这些轮廓的路径被抓取并以 pyplot 的另一种方式绘制 - 内置的遮罩和剪裁似乎可能不适用。

也许我在最初的轮廓创建中忽略了文档中的一个论点 - 或者其他一些满足所描述需求的方法?

感谢您提供线索或智慧。

当前输入:

(meshXList、meshYList 和 valueZList 是位于所示多边形内的各向同性网格质心坐标)

X = np.array(self.meshXList).reshape(self.numRows,self.numCols)
Y = np.array(self.meshYList).reshape(self.numRows,self.numCols)
Z = np.array(self.valueZList).reshape(self.numRows,self.numCols)

conIntrv = float(self.conIntNum.text())
minCon,maxCon = float(self.minConLineNum.text()),float(self.maxConLineNum.text())
numCon = int((maxCon-minCon)/conIntrv)
levels = np.linspace(minCon,maxCon,numCon)

contours = plt.contour(X,Y,Z,levels,antialiased=True)
conCollect = contours.collections

rawContourLines = []
for lineIdx, line in enumerate(conCollect):
    lineStrings = []
    for path in line.get_paths():
        if len(path.vertices)>1:
            lineStrings.append(path.vertices)
    rawContourLines.append(lineStrings)

更新相关解析:

最崇高的敬意 @tom10 对我来说应该是显而易见的。 附图中的灰色区域被包含在meshXList、meshYList和valueZList中;虽然不是在 GIS 程序中选择显示。

了解 valueZList 不需要数值(使用 -999.99999999999),而是可以合并 {None} 揭示了一个非常简单的问题解决方案:

    emptValue = None
    self.valueZList = [emptValue]*len(self.meshXList)
    with open(valueFile, "r") as valueInput:
        reader = csv.reader(valueInput)
        for idx,row in enumerate(reader):
            if idx==0: self.valueType = row[1]
            if idx>0:
                holdingIdx = int(row[0])
                holdingVal = float(row[1])
                if '888.88' in holdingVal or '777.77' in holdingVal:
                    self.valueZList[holdingIdx] = emptValue
                else:
                    self.valueZList[holdingIdx]=holdingVal
                    if holdingVal<minValue: minValue = holdingVal
                    if holdingVal>maxValue: maxValue = holdingVal

“无类型”的万岁。

【问题讨论】:

    标签: python matplotlib contour polyline qgis


    【解决方案1】:

    一种方法是将边界外的区域设置为None。因此修改standard example 以给出“开放”轮廓:

    import matplotlib
    import numpy as np
    import matplotlib.cm as cm
    import matplotlib.mlab as mlab
    import matplotlib.pyplot as plt
    
    matplotlib.rcParams['xtick.direction'] = 'out'
    matplotlib.rcParams['ytick.direction'] = 'out'
    
    delta = 0.025
    x = np.arange(-3.0, 3.0, delta)
    y = np.arange(-2.0, 2.0, delta)
    X, Y = np.meshgrid(x, y)
    Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    # difference of Gaussians
    Z = 10.0 * (Z2 - Z1)
    
    Z[X<-1] = None
    Z[X>2] = None
    
    plt.figure()
    CS = plt.contour(X, Y, Z, levels=np.arange(-.5, 2, .5))
    plt.clabel(CS, inline=1, fontsize=10)
    plt.title('Simplest default with labels')
    
    plt.show()
    

    或者,更有趣一点(使用,Z[X*X+(Y-1)**2&gt;3.] = None):

    【讨论】:

    • 哇。对于有问题的应用程序来说,这看起来很有趣,也很棘手。必须评估代表每个轮廓的截止点的看似无限多的多边形形状。这样每个轮廓相对于多边形周长的缓冲区的接近阈值将产生所述相交的 x 和 y 坐标,并为每个轮廓提供无范围?当然,在这种情况下我可能会误解 None 的用法。
    • 您将圆方程作为无剪辑的最后一个示例似乎是路线。虽然我可以轻松访问多边形几何体或周长;实现例如一组用于无剪辑的方程有点超出我目前的数学范围。在这样的应用程序中是否可以使用不规则的多边形形式?
    • @Katalpa:在您的图中,您已将一些区域像素设为灰色(我假设这些像素未包含在您的分析中),而其他像素为非灰色。我要说的是在一个数组上计算你的轮廓,其中灰色像素的值为None
    • 就是这么简单。为 None 类型欢呼。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 2016-09-14
    • 2022-01-24
    • 2023-03-18
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多