Построение суммы нескольких линий графика - PullRequest
0 голосов
/ 06 марта 2020

Я построил несколько линий, используя данные из массивов. Дело в том, что я хочу построить новую линию, которая показывает сумму всех этих линий. Имейте в виду, что значения х из каждого набора различны. Позвольте мне привести пример того, что я пытаюсь сделать. Допустим, у меня есть 2 набора (x, y) данных, таких как:

 x1=np.array([1,2,3,4,5])
 y1=np.array([1,3,5,7,9])
 x2=np.array([3,4,5,6,7])
 y2=np.array([2,4,6,8,10])

Затем я использую np.interp

 xvals1=np.linspace(1,5,1000)
 yinterp1 = np.interp(xvals1, x1, y1)
 plt.plot(xvals1, yinterp1)
 xvals2=np.linspace(3,7,1000)
 yinterp2 = np.interp(xvals2, x2, y2)
 plt.plot(xvals2, yinterp2)

Хорошо, так что теперь я хочу дополнительные строка, которая показывает сумму этих двух строк. Но если я сделаю следующее, это даст мне строку (зеленого цвета), которая определенно неверна:

xvals=np.linspace(1,7,1000)
plt.plot(xvals,yinterp1+yinterp2)

image of the plot is here

У кого-нибудь есть какие-либо идеи по этому поводу?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Когда вы делаете y1+ y2, результат равен [y1[0]+y2[0], y1[1]+y2[1], ...]. В вашем конкретном случае c индексы соответствуют различным значениям, поэтому вы фактически делаете [y1[x=1]+y2[x=3], ..., y1[x=5]+y2[x=7]], который не имеет физического смысла.

Нам нужно замаскировать значений, чтобы они имеет смысл и y "выровнены" для дополнения. Под выравниванием я подразумеваю, что один и тот же индекс соответствует тому же x.

enter image description here

import numpy as np
import matplotlib.pyplot as plt

x1 = np.array([1, 2, 3, 4, 5])
y1 = np.array([1, 3, 5, 7, 9])
x2 = np.array([3, 4, 5, 6, 7])
y2 = np.array([2, 4, 6, 8, 10])

xvals1 = np.linspace(1, 5, 1000)
yinterp1 = np.interp(xvals1, x1, y1)
plt.plot(xvals1, yinterp1)

xvals2 = np.linspace(3, 7, 1000)
yinterp2 = np.interp(xvals2, x2, y2)
plt.plot(xvals2, yinterp2)

xvals = np.linspace(1, 7, 1000)
x1_and_x2_intersection_mask = (np.logical_and(3 <= xvals, xvals <= 5))
xinter = xvals[x1_and_x2_intersection_mask]
yi1 = yinterp1[x1_and_x2_intersection_mask]
yi2 = yinterp2[x1_and_x2_intersection_mask]
plt.plot(xinter, yi1+yi2)

Теперь относительно вашего комментария удалите последнюю строку приведенного выше кода и добавьте его:

def mask_between_a_b(array, a, b):
    """I make functions when I have to use something more than once."""
    return np.logical_and(a <= array, array <= b)

# Create the masked data for the two regions where blue and orange don't share an x.
x1_mask = mask_between_a_b(x1, 1, 3)
x2_mask = mask_between_a_b(x2, 5, 7)

x1m = x1[x1_mask]
y1m = y1[x1_mask]
x2m = x2[x2_mask]
y2m = y2[x2_mask]

# Add all three regions together to get the full curve.
x = list(x1m) + list(xinter) + list(x2m)
y = list(y1m) + list(yi1+yi2) + list(y2m)
plt.plot(x, y)

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

enter image description here

0 голосов
/ 06 марта 2020

Нельзя добавить значения y, поскольку соответствующие значения x отличаются. Чтобы добавить их, вам понадобятся значения x в тех же диапазонах. Например, в вашем коде первая точка с добавлением будет результатом f1(1) + f2(3), что не то, что вы хотите. То, что вы хотите, это f1(1) + f2(1)

Вы должны сделать

 xvals1=np.linspace(1,5,5)
 yinterp1 = np.interp(xvals1, x1, y1)
 plt.plot(xvals1, yinterp1)
 xvals2=np.linspace(1,5,5)
 yinterp2 = np.interp(xvals2, x2, y2)
 plt.plot(xvals2, yinterp2)
 xvals=np.linspace(1,5,5)
 plt.plot(xvals,yinterp1+yinterp2)

enter image description here

Более того, вам придется определить значения y2 от 1 до 7, потому что вы хотите, чтобы форма строки суммирования 1 до 7.

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