Повторное построение контура с заполненным контуром с использованием PatchCollection - PullRequest
1 голос
/ 29 мая 2019

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

Минимальный код, над которым я работаю:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection, PolyCollection

x = np.arange(0, 300,1)
y = np.arange(0, 300,1)
X, Y = np.meshgrid(y, x)
Topo = np.cos(X*2*np.pi/50)*np.sin(Y*2*np.pi/200)*y

plt.figure()
ax = plt.subplot(1,2,1)
plt.setp(ax.get_xticklabels(), visible=False)
plt.setp(ax.get_yticklabels(), visible=False)
ax.set_xticks([])
ax.set_yticks([])

Ncolors = 50
levels = np.linspace(np.min(Topo),np.max(Topo),Ncolors)
# h = plt.contourf(X,Y, Topo, levels = levels, cmap = cmap, vmin = 0.85*np.min(Topo), zorder = -10)
h = plt.contourf(Y, X, Topo, levels = levels)

ax = plt.subplot(1,2,2)
plt.setp(ax.get_xticklabels(), visible=False)
plt.setp(ax.get_yticklabels(), visible=False)
ax.set_xticks([])
ax.set_yticks([])

i = 0
for levellines in h.collections:
    for lines in levellines.get_paths():
        plt.gca().add_collection(PatchCollection( [ Polygon( lines.vertices ) ] , facecolor = levellines.get_facecolor()[0], edgecolor = levellines.get_facecolor()[0]) )
    i = i+1
plt.xlim([x.min(), x.max()])
plt.ylim([y.min(), y.max()])

enter image description here Как выможет спросить, почему я пытаюсь пройти через функцию Polygon и вершины пути: позже мне нужно будет немного изменить координаты вершин lines.vertices, чтобы сделать некоторые проекции, изменить точки обзора и т. д.

Обратите внимание, что результат сильно зависит от нанесенной на поверхность поверхности. Иногда артефакт не появляется, иногда он намного хуже, чем этот.

1 Ответ

0 голосов
/ 29 мая 2019

Мне удалось найти проблему.Артефакты появляются, когда пути, содержащиеся в lines, являются не простыми путями, а кривыми Безье или другими.

Поэтому для добавления этой информации, содержащейся в атрибуте codes, вам необходимо построить пути вместо полигонов.

Использование Juste:

from matplotlib.path import Path
import matplotlib.patches as patches

, а затем:

plt.gca().add_patch(patches.PathPatch( Path(lines.vertices, lines.codes) , facecolor = levellines.get_facecolor()[0], edgecolor = levellines.get_facecolor()[0]) )

вместо

 plt.gca().add_collection(PatchCollection( [ Polygon( lines.vertices ) ] , facecolor = levellines.get_facecolor()[0], edgecolor = levellines.get_facecolor()[0]) )

Наконец, вы также можете преобразовать пути вПолигоны, использующие .to_polygons():

 plt.gca().add_collection(PatchCollection( [ Polygon( lines.to_polygons() ) ] , facecolor = levellines.get_facecolor()[0], edgecolor = levellines.get_facecolor()[0]) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...