#python #numpy #matplotlib #plot #visualization
Вопрос:
Я использую matplotlib для построения этих двух линейных графиков. Однако только иногда мои графики пересекались. Как я могу определить, пересекаются ли мои линейные графики?
df = pd.read_csv("test.csv")
df2 = pd.read_csv("test2.csv")
x1 = df['A'].tolist()
x1 = np.array(x1)
y1 = df['D'].tolist()
y1 = np.array(y1)
x2 = df2['X'].tolist()
x2 = np.array(x2)
y2 = df2['Y'].tolist()
y2 = np.array(y2)
plt.plot(x1,y1)
plt.plot(x2,y2)
plt.show()
Ответ №1:
Вы можете вычислить индекс точек пересечения с:
idx = np.argwhere(np.diff(np.sign(y1 - y2))).flatten()
Если есть одно или несколько пересечений, idx
отображается список точек пересечения, в противном случае это пустой список.
- одно или несколько пересечений
import numpy as np import matplotlib.pyplot as plt x1 = np.linspace(0, 10, 1000) x2 = np.linspace(-2, 5, 1000) y1 = np.sin(x1) y2 = np.cos(x2) 1 idx = np.argwhere(np.diff(np.sign(y1 - y2))).flatten() fig, ax = plt.subplots() ax.plot(x1, y1, 'blue') ax.plot(x2, y2, 'red') plt.show()
print(len(idx)) 2
- никаких пересечений
import numpy as np import matplotlib.pyplot as plt x1 = np.linspace(0, 10, 1000) x2 = np.linspace(-2, 5, 1000) y1 = np.sin(x1) y2 = np.cos(x2) 2 idx = np.argwhere(np.diff(np.sign(y1 - y2))).flatten() fig, ax = plt.subplots() ax.plot(x1, y1, 'blue') ax.plot(x2, y2, 'red') plt.show()
print(len(idx)) 0
Комментарии:
1. Я получаю эту ошибку : операнды не могут быть переданы вместе с фигурами (674,) (14,) . Я думаю, это из-за разных размеров numpy. Для построения первого графика потребовалось 674 балла, а для второго-всего 14 баллов. Знаете ли вы какие-либо способы преодолеть это?
Ответ №2:
Этот код выводит «пересечение», если значения y пересекаются в какой-то момент.
mark = y1[0]-y2[0]
for i in range(len(y1)):
if mark > 0:
if y1[i]-y2[i] < 0:
print('intersect')
elif mark < 0:
if y1[i]-y2[i] > 0:
print('intersect')