Как добавить вертикальную линию к существующему графику в matplotlibPython

Программы на Python
Ответить
Anonymous
 Как добавить вертикальную линию к существующему графику в matplotlib

Сообщение Anonymous »

У меня есть большой набор данных (5 миллионов точек) для визуализации. Существуют точки данных и оси времени.

Есть события во времени, значения которых значительно меняются.

Я хочу добавить два «кликабельных» элемента в виде вертикальных линий для обозначения два из упомянутых событий, позже я хочу отобразить их временные значения и рассчитанную разницу.
import matplotlib.pyplot as plt

time = [1,2,3,4,5,6,7,8,9,10,11,12,13,13,15,16,17,18,19,20]
ch1_scope = [0,0,0,0,5,5,5,5,0,0,0,0,5,5,5,5,0,0,0,0]
ch2_scope = [5,5,5,5,0,0,0,0,5,5,5,5,0,0,0,0,5,5,5,5]

fig, (ax1, ax2) = plt.subplots(2, sharex = True)

ax1.plot(time, ch1_scope, 'tab:red')
ax1.set_title("Vph1")
ax2.plot(time, ch2_scope, 'tab:olive')
ax2.set_title("Vph2")

Этот минимальный код создает:

Изображение

Как этого добиться с помощью matplotlib? Возможно ли это вообще без перерисовки/перерисовки?

Простой скрипт, в котором возможно добавление вертикальных линий, это было бы хорошим началом.
После некоторого времени пытается добавить этот курсор:
import matplotlib.pyplot as plt
from matplotlib.widgets import Cursor

time = [1,2,3,4,5,6,7,8,9,10,11,12,13,13,15,16,17,18,19,20]
ch1_scope = [0,0,0,0,5,5,5,5,0,0,0,0,5,5,5,5,0,0,0,0]
ch2_scope = [5,5,5,5,0,0,0,0,5,5,5,5,0,0,0,0,5,5,5,5]

fig, (ax1, ax2) = plt.subplots(2, sharex = True)

ax1.plot(time, ch1_scope, 'tab:red')
ax1.set_title("Vph1")
ax2.plot(time, ch2_scope, 'tab:olive')
ax2.set_title("Vph2")

cursor = Cursor(
ax1, useblit=True, horizOn=False, vertOn=True, color="red", linewidth=0.5)

plt.show()

Изображение

Это неудовлетворительно, так как курсор не перемещается постоянно (масштабирование убивает его). Также отсутствует возможность динамического добавления обозначений на график.
Добавлена ​​часть события клика. Это выведет на консоль некоторую текущую информацию о положении мыши. Как перенести это в сюжет?
enter code here
import matplotlib.pyplot as plt
from matplotlib.widgets import Cursor
from matplotlib.backend_bases import MouseButton

time = [1,2,3,4,5,6,7,8,9,10,11,12,13,13,15,16,17,18,19,20]
ch1_scope = [0,0,0,0,5,5,5,5,0,0,0,0,5,5,5,5,0,0,0,0]
ch2_scope = [5,5,5,5,0,0,0,0,5,5,5,5,0,0,0,0,5,5,5,5]

fig, (ax1, ax2) = plt.subplots(2, sharex = True)

ax1.plot(time, ch1_scope, 'tab:red')
ax1.set_title("Vph1")
ax2.plot(time, ch2_scope, 'tab:olive')
ax2.set_title("Vph2")

cursor = Cursor(
ax1, useblit=True, horizOn=False, vertOn=True, color="red", linewidth=0.5
)

def on_move(event):
if event.inaxes:
print(f'data coords {event.xdata} {event.ydata},',
f'pixel coords {event.x} {event.y}')

def on_right_click(event):
if event.button is MouseButton.LEFT:
print(f'Clicked LMB: data coords {event.xdata} {event.ydata}')
if event.button is MouseButton.RIGHT:
print('disconnecting callback')
plt.disconnect(binding_id)

binding_id = plt.connect('motion_notify_event', on_move)
plt.connect('button_press_event', on_right_click)

plt.show()


Подробнее здесь: https://stackoverflow.com/questions/790 ... matplotlib
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»