Незамкнутые контуры в матплотлиб?

При реализации (замечательного matplotlib) контурирования в препроцессоре ГИС, результаты немного нежелательны [см. Прилагаемое изображение для ссылок].

Вместо того, чтобы идеально показывать сегменты полилинии (обведенная оранжевая область), результаты представляют собой замкнутые многоугольные петли (выделенный зеленым путем).

пример контура

Мой лучший вывод логики в игре; слева направо на прикрепленном изображении уровни контура уменьшаются. Закрытие циклов предполагает, что matplotlib.pyplot.contours() включает в себя все значения в пределах указанных уровней - следовательно, замкнутый цикл?

Цель состоит в том, чтобы эти приблизительно перпендикулярные уровни контура отсекались на границах указанной формы. Принимая во внимание, что пути для этих контуров захватываются и наносятся в виде альтернативного средства для составления графика - встроенная маскировка и отсечение кажутся неподходящими.

Возможно, в документах, которые я пропускаю при первоначальном создании контура, есть аргумент, или какие-то другие средства для удовлетворения описанных потребностей?

Спасибо за подсказки или мудрость.

Токовый вход (ы):

(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; хотя не отображается по выбору в программе ГИС.

Понимание того, что значение ZList не требует числовых значений (использовалось -999,999999999999), а скорее может включать {Нет}, выявило чрезвычайно простое решение проблемы:

    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

Извините за "Нет Типа".правильное ограничение

1 ответ

Решение

Один из способов сделать это - установить область за пределами вашей границы на 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()

Или немного больше удовольствия (используя, Z[X*X+(Y-1)**2>3.] = None):

Другие вопросы по тегам