Как определить, есть ли пересечение, используя matplotlib?

#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')