python - matplotlib 中的非闭合轮廓?

标签 python matplotlib contour polyline qgis

在 GIS 预处理器中实现(精彩的 matplotlib)等值线时,结果有点不理想 [请参阅附图以获取引用]。

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

contour example

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

目标是使这些大致垂直的轮廓水平在所述形状的边界处被剪掉。考虑到这些轮廓的路径是用 pyplot 的替代方法抓取和绘制的 - 内置的 mask 和剪切似乎可能不适用。

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

感谢您的线索或智慧。

当前输入:

(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

向“无类型”致敬。 proper bounding

最佳答案

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

enter image description here

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>3.] = None):

enter image description here

关于python - matplotlib 中的非闭合轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29368636/

相关文章:

android - 在 Android 上移动轮廓

matplotlib - 使用函数绘制等值线图

java - OpenCv安卓: Copy part of an image to new Mat

python - 在 python MySQLdb executemany() 中包含数据库函数调用

python - 将 Pandas 数据帧的每一列与同一数据帧的所有其他列相乘的最有效方法

python - 找不到 Jupyter notebook jt 命令

python - 轴隐藏的标记

python - 如何判断 Python 模块是否从模块内重新加载()

python numpy scipy griddata 是 nan 或所有相同的值

python - matplotlib - 更快的帧率?