Python matplotlib中的非闭合等高线?

Python matplotlib中的非闭合等高线?,python,matplotlib,contour,polyline,qgis,Python,Matplotlib,Contour,Polyline,Qgis,在GIS预处理器中实现(奇妙的matplotlib)等高线时,结果有些不理想[参考附件] 结果不是理想地显示多段线线段(橙色圆圈区域),而是闭合多边形循环(绿色高亮显示的路径) 我对逻辑的最佳推理;在所附图像中,从左到右,轮廓级别逐渐降低。闭合的循环表明matplotlib.pyplot.contours()合并了上述级别范围内的所有值-因此闭合循环 我们的目标是让这些大致垂直的轮廓线水平线在所述形状的边界处剪掉。考虑到这些等高线的路径被抓取并以pyplot的替代方式绘制-内置的遮罩和剪裁似乎

在GIS预处理器中实现(奇妙的matplotlib)等高线时,结果有些不理想[参考附件]

结果不是理想地显示多段线线段(橙色圆圈区域),而是闭合多边形循环(绿色高亮显示的路径)

我对逻辑的最佳推理;在所附图像中,从左到右,轮廓级别逐渐降低。闭合的循环表明matplotlib.pyplot.contours()合并了上述级别范围内的所有值-因此闭合循环

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

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

谢谢你的提示和智慧

当前输入:

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

更新相关解析: 最崇高的敬意@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
emptValue=None
self.valueZList=[emptValue]*len(self.meshXList)
打开(valueFile,“r”)作为valueInput:
reader=csv.reader(valueInput)
对于idx,枚举(读取器)中的行:
如果idx==0:self.valueType=行[1]
如果idx>0:
holdingIdx=int(第[0]行)
holdingVal=浮动(第[1]行)
如果holdingVal中的“888.88”或holdingVal中的“777.77”:
self.valueZList[holdingIdx]=emptValue
其他:
self.valueZList[holdingIdx]=holdingVal
如果holdingValmaxValue:maxValue=holdingVal
“无类型”的Horray。

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

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()

导入matplotlib
将numpy作为np导入
将matplotlib.cm导入为cm
将matplotlib.mlab导入为mlab
将matplotlib.pyplot作为plt导入
matplotlib.rcParams['xtick.direction']='out'
matplotlib.rcParams['ytick.direction']='out'
增量=0.025
x=np.arange(-3.0,3.0,delta)
y=np.arange(-2.0,2.0,delta)
十、 Y=np.meshgrid(X,Y)
Z1=mlab.二元_正态(X,Y,1.0,1.0,0.0,0.0)
Z2=mlab.二元正态(X,Y,1.5,0.5,1,1)
#高斯差分
Z=10.0*(Z2-Z1)
Z[X2]=无
plt.图()
CS=plt.等高线(X,Y,Z,标高=np.arange(-0.5,2,5))
plt.clabel(CS,inline=1,fontsize=10)
plt.title('带标签的最简单默认值')
plt.show()
或者,更有趣一点(使用,
Z[X*X+(Y-1)**2>3.]=None
):


哇。对于所讨论的应用程序来说,这看起来很有趣,也很棘手。必须评估代表每个轮廓分界点的看似无限多样的多边形形状。这样,相对于多边形周长缓冲区的每个轮廓接近阈值将产生所述相交的x和y坐标,并为每个轮廓提供无范围?当然,我可能会误解None在这种情况下的用法。你最后一个例子是圆的方程,因为None剪辑似乎是路线。虽然我能够很容易地访问多边形几何体,或周边的问题;实现诸如无剪辑的一组方程,在当前的数学范围之外有点。在这样的应用程序中,不规则多边形形式可能吗?@Katalpa:在您的图中,您将一些区域像素设置为灰色(我假设这些像素不包括在您的分析中),而其他像素则为非灰色。我想说的是在一个数组上计算轮廓,其中灰色像素的值为
None
。就是这么简单。万岁,无类型。谢谢
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()