Когда вы делаете 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
.
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)
Вы просто должны быть осторожны с маскировкой, и я думаю, границы могут быть созданы автоматически, но это выходит за рамки вопроса.