У меня есть контурный график, который создается с использованием Triangulation / TriInterpolation и contourf, как показано на изображении ниже. У меня также есть две кривые, построенные по обе стороны от контура, которые являются границей, где данные не должны проходить. Как видно в нижнем левом углу, данные перетекают через левую линию (я уверен, из-за попытки триангуляции соединить треугольники), и я хочу найти способ использовать левую линию, чтобы заставить все, что указано выше. он должен быть замаскирован или обрезан, поскольку я буду добавлять больше данных, которые, несомненно, будут делать то же самое.

Я попытался использовать отсечение через matplotlib.patches и через обычную маскировку, но, похоже, не могу понять этого.

Данные для левой строки такие:

Leftx = [0.319,0.373,0.407,0.432,0.452,0.469,0.483,0.495,0.506,0.516,0.525,0.533,0.541,0.548,0.554,0.560,0.566,0.571,0.576,0.580,0.585,0.589,0.593,0.597 , 0,600,0.604,0.607,0,610,0,613,0,616]

Левша = [0,5,1,0,1,5,2,0,2,5,3,0,3,5,4,0,4,5,5,5,0,5,5,6,0,6,5,7,0,7,5,8,0,8,5,9,0,9,5,10,0,10,5,11,0,11,5,12,0 , 12,5,13,0,13,5,14,0,14,5,15,0]

И сетка для триангуляции / контура была

xi = np.linspace(0, 1.2, 1000)
yi = np.linspace(0, 15.0, 1000)
Xi, Yi = np.meshgrid(xi, yi)
triang = tri.Triangulation(xdata,ydata)
interpolator = tri.LinearTriInterpolator(triang, zdata)
zi = interpolator(Xi, Yi)

Как мне это сделать? Спасибо заранее! :)

Contour Plot

1
Fëanor Ares 7 Сен 2020 в 22:53

1 ответ

Лучший ответ

Вы можете создать clip_path аналогично этому сообщению . Форма клипа может быть создана с помощью левой кривой и обратной правой кривой.

Обратите внимание, что к сюжету нужно добавить clip_path. Это необходимо для того, чтобы все точки были преобразованы в правильные оси. Его можно нарисовать с помощью color='none', чтобы сделать его невидимым.

Вот тестовый код, демонстрирующий, как он может работать в вашей ситуации:

import matplotlib.pyplot as plt
from matplotlib import path as mpath
from matplotlib import patches as mpatches
import numpy as np

N = 100
xdata = np.random.uniform(0, 1.2, N)
ydata = np.random.uniform(0, 15, N)
zdata = np.random.uniform(0, 90, N)

leftx = np.array([0.319, 0.373, 0.407, 0.432, 0.452, 0.469, 0.483, 0.495, 0.506, 0.516, 0.525, 0.533, 0.541, 0.548, 0.554, 0.560, 0.566, 0.571, 0.576, 0.580, 0.585, 0.589, 0.593, 0.597, 0.600, 0.604, 0.607, 0.610, 0.613, 0.616])
lefty = np.array([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0])
rightx = leftx + 0.6
righty = lefty
vertices = np.vstack([np.concatenate([leftx, rightx[::-1]]), np.concatenate([lefty, righty[::-1]])]).T
poly_codes = [mpath.Path.MOVETO] + (len(vertices) - 1) * [mpath.Path.LINETO]
path = mpath.Path(vertices, poly_codes)
clip_patch = mpatches.PathPatch(path, facecolor='none', edgecolor='none')
plt.gca().add_patch(clip_patch)

cont = plt.tricontourf(xdata, ydata, zdata, levels=10, cmap='hot')
for c in cont.collections:
    c.set_clip_path(clip_patch)

plt.show()

example plot

1
JohanC 7 Сен 2020 в 20:58