#python #numpy #matplotlib
Вопрос:
У меня есть два массива для значений x и два соответствующих массива для значений y, которые я хочу построить.
import numpy as np import matplotlib.pyplot as plt x1 = np.linspace(-2,2,100) x2 = np.linspace(0,4,100) y1 = x1**2 1 y2 = (x2-1.5)**2 plt.plot(x1,y1) plt.plot(x2,y2) plt.show()
Это приводит к следующему сюжету.
Но вместо этого я хочу построить только минимумы этих двух кривых, т. Е. Только область y1, где y1lt;y2, и только область y2, где y2 Что-то вроде этого.
Поскольку x1 и x2 разные, я не могу использовать np.minimum(). Есть ли эффективный способ сделать это с помощью numpy и/или matplotlib?
Я хотел бы иметь общий подход, который также работает, когда y1 и y2 определяются не из какой-либо известной мне функции, а взяты, например, из набора данных.
Комментарии:
1. Итак, вам нужна какая-то штучная функция, например ?
y1 for xlt;0.5 else y2
Вы пишете, что хотите построить минимумы обеих функций, но это не то, что вы строите ?
Ответ №1:
Вы можете интерполировать обе функции на общий x, а затем взять их минимум.
import numpy as np import matplotlib.pyplot as plt x1 = np.linspace(-2, 2, 100) x2 = np.linspace(0, 4, 100) y1 = x1 ** 2 1 y2 = (x2 - 1.5) ** 2 plt.plot(x1, y1, ls=':') plt.plot(x2, y2, ls=':') xc = np.sort(np.concatenate([x1, x2])) y1c = np.interp(xc, x1, y1, left=y2.max(), right=y2.max()) y2c = np.interp(xc, x2, y2, left=y1.max(), right=y1.max()) plt.plot(xc, np.minimum(y1c, y2c), lw=10, alpha=0.4) plt.show()
Ответ №2:
Одним из решений является перекрестное вычисление функций с помощью других xs и маски:
import numpy as np import matplotlib.pyplot as plt x1 = np.linspace(-2,2,100) x2 = np.linspace(0,4,100) y1 = x1**2 1 y1b = x2**2 1 y2 = (x2-1.5)**2 y2b = (x1-1.5)**2 plt.plot(x1, np.where(y1lt;y2b, y1, np.nan)) plt.plot(x2, np.where(y2lt;y1b, y2, np.nan)) plt.show()
выход:
Комментарии:
1. Это работает в данном конкретном случае, но мне также нужно более общее решение; оно работает, когда я сам не определяю y1 и y2 с помощью известной функции, а вместо этого извлекаю их из набора данных.
2. @Тот, кого я вижу, вы должны были упомянуть об этом, я бы предложил другой подход 😉