python: нарисовать вертикальную линию в matplotlib - PullRequest
0 голосов
/ 25 октября 2018

Я сделал график и нарисовал вертикальную линию на графике, проблема в том, что я не могу аннотировать точку контакта на графике, а вот вертикальная линия - код:

for p in range(limit):
    pwf.append(random.randint(0,100))

for s in pwf:
    flo_rate = pwf[i]*2
    flowrate.append(flo_rate)
    i += 1

plt.plot(flowrate,pwf)
plt.axvline(20)
plt.show()

1 Ответ

0 голосов
/ 25 октября 2018

Вот рабочий ответ для вас (исключая команды импорта).Идея заключается в следующем: сделать линейное подгонку к вашим данным, используя очень мелко расположенную x-сетку (используя 10000 точек сетки здесь, также можно использовать меньшую сетку).Вычтите 20 из этих точек х-сетки, чтобы получить расстояние от вертикальной линии.Точка пересечения будет иметь кратчайшее расстояние.Найдите это расстояние, используя min, а затем получите соответствующее значение y (pwf), которое будет точкой пересечения.

Получив эту точку пересечения, используйте plt.annotate, чтобы пометить точку стрелкойи желаемый текст.

pwf, flowrate = [[] for _ in range(2)]
limit = 200

for p in range(limit):
    pwf.append(np.random.randint(0,100))

for i, s in enumerate(pwf):
    flo_rate = pwf[i]*2
    flowrate.append(flo_rate)

fit = np.poly1d(np.polyfit(flowrate,pwf, 1))
x_mesh = np.linspace(min(flowrate), max(flowrate), 10000)
idx = np.argmin(abs(x_mesh - 20)) 

plt.plot(flowrate,pwf)
plt.axvline(20)

plt.annotate('Intersection', xy=(20, 0.95*fit(x_mesh[idx])), xytext=(50, 15),
            arrowprops=dict(arrowstyle="->"),fontsize=16
            )

enter image description here

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