Как заполнить многоугольник, образованный 3 разными наборами массивов? - PullRequest
1 голос
/ 05 мая 2020

Я вижу, что fill_between () требует единственного диапазона x. Но в моем случае у меня есть 3 набора массивов, которые охватывают разные диапазоны по оси x. Эти кривые соединяются на концах, образуя многоугольник. Например:

x1 = [1,2,3,4,5]
y1 = [5,4,3,2,1]

x2 = [1,3,5,6,7]
y2 = [5,6,7,8,9]

x3 = [7,6.5,7,8,5]
y3 = [9,8,8,6,1]

plt.plot(x1,y1,
         x2,y2,
         x3,y3)

enter image description here

Однако мои настоящие массивы имеют длину 1000, так что это просто упрощенный пример, поясняющий мой вопрос. Есть предложения?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы можете использовать shapely для автоматического объединения сегментов линии.

import matplotlib.pyplot as plt
from shapely.geometry import LineString
from shapely.ops import linemerge

x1 = [1,2,3,4,5]
y1 = [5,4,3,2,1]

x2 = [1,3,5,6,7]
y2 = [5,6,7,8,9]

x3 = [7,6.5,7,8,5]
y3 = [9,8,8,6,1]    

l1 = LineString(zip(x1, y1))
l2 = LineString(zip(x2, y2))
l3 = LineString(zip(x3, y3))
l = linemerge([l1, l2, l3])
x, y = l.coords.xy
plt.fill(x, y)
# or plt.fill_between(x, y)

enter image description here

2 голосов
/ 05 мая 2020

Вы можете использовать plt.fill, чтобы нарисовать заполненный многоугольник. Достаточно просто объединить списки для создания замкнутого многоугольника. Обратите внимание, что все сегменты должны быть последовательными, поэтому первый сегмент необходимо перевернуть, чтобы он соответствовал двум другим. Многоугольник может быть выпуклым, вогнутым или даже самопересекающимся.

import matplotlib.pyplot as plt

x1 = [1,2,3,4,5]
y1 = [5,4,3,2,1]

x2 = [1,3,5,6,7]
y2 = [5,6,7,8,9]

x3 = [7,6.5,7,8,5]
y3 = [9,8,8,6,1]

plt.plot(x1[::-1]+x2+x3, y1[::-1]+y2+y3, c='navy')
plt.fill(x1[::-1]+x2+x3, y1[::-1]+y2+y3, c='crimson', alpha=0.3)

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...