В matplotlib, как мне заполнить две кривые, определенные двумя различными наборами массивов? - PullRequest
0 голосов
/ 18 января 2019

У меня есть две кривые, определенные двумя наборами массивов: (x1, y1) и (x2, y2), и я хочу заполнить их полигонами. Все массивы имеют одинаковую длину, но x1 и x2 содержат разные значения.

plt.fill_between(x, y1, y2) требует, чтобы обе кривые совместно использовали один и тот же массив x.

Как мне сделать что-то вроде fill_between(x1, y1, x2, y2)?

Например, если:

x1 = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) и y1 = np.array([3.0, 2.0, 3.0, 2.0, 3.0]) определяют первую кривую

и

x2 = np.array([1.5, 2.5 ,3.5 ,4.5 , 5.5]) и y2 = np.array([5.0, 6.0, 7.0, 8.0, 9.0]) определяют второе.

Как залить цвета между кривыми (x1, y1) и (x2, y2), используя четыре многоугольника (левая и правая границы не обязательно должны быть вертикальными)?

Для пояснения, четыре полигона (A, B, C, D) будут иметь координаты:

A: [(1.0, 3.0), (1.5, 5.0), (2.5, 6.0), (2.0, 2.0)]
B: [(2.0, 2.0), (2.5, 6.0), (3.5, 7.0), (3.0, 3.0)]
C: [(3.0, 3.0), (3.5, 7.0), (4.5, 8.0), (4.0, 2.0)]
D: [(4.0, 2.0), (4.5, 8.0), (5.5, 9.0), (5.0, 3.0)]

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы можете использовать многоугольные патчи, чтобы нарисовать четырехугольники, заполняющие пространство между двумя кривыми - единственная сложная точка - это генерация 5 точек, которые определяют многоугольник, но (ab), используя zip, это можно сделать ... также вам нужно знать, как разместить полигоны на графике, но это легко, если вы знаете matplotlib.collections.PatchCollection и ax.add_collection

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

x1 = np.linspace(0,6,21) ; y1 = np.sin(x1)
x2 = x1+0.28 ; y2 = np.cos(x2)

fig, ax = plt.subplots()                                                         
ax.plot(x1, y1, x2, y2)
patches = [Polygon(poly) for poly in (
              [p0,p1,p2,p3,p0] for p0,p1,p2,p3 in 
                    zip(zip(x1,y1),zip(x1[1:],y1[1:]),zip(x2[1:],y2[1:]),zip(x2,y2)))
ax.add_collection(PatchCollection(patches, alpha=0.6))

a sample plot

Как видите, это не идеально , но, может быть, это достаточно хорошо ...

0 голосов
/ 18 января 2019

Я изо всех сил пытаюсь однозначно истолковать ваш вопрос, но я думаю, что вы просто хотите использовать fill, что-то вроде:

import numpy as np
import matplotlib.pyplot as plt

x1 = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y1 = np.array([3.0, 2.0, 3.0, 2.0, 3.0])

x2 = np.array([1.5, 2.5, 3.5, 4.5, 5.5])
y2 = np.array([5.0, 6.0, 7.0, 8.0, 9.0])

plt.plot(x1, y1, 'o')
plt.plot(x2, y2, 'x')

plt.fill(
    np.append(x1, x2[::-1]),
    np.append(y1, y2[::-1]),
)

даст вам

this plot

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