Рубрики
Без рубрики

Matplotlib курсор – как добавить курсор и аннотировать свой сюжет

https://youtu.be/oozyp66imp4 Эта статья объясняет, как вставить курсор на ваш сюжет, как настроить его и как хранить значения, которые вы выбрали на окне графика. Во многих ситуациях мы можем захотеть выбрать и хранить координаты определенных точек на нашем графике; Это просто для оценки их ценности … matplotlib курсор – как добавить курсор и аннотировать ваш участок Подробнее »

Автор оригинала: Andrea Ridolfi.

Эта статья объясняет Как вставить курсор на ваш участок , как настроить его и как хранить значения, которые вы выбрали на окне сюжета. Во многих ситуациях мы можем захотеть выбрать и хранить координаты определенных точек на нашем графике; Это просто для оценки их стоимости или потому, что мы можем захотеть использовать некоторые конкретные значения для последовательной обработки данных. Как вы увидите, это не сложная задача, но это добавит много ценности на ваши участки. Мы также увидим, как выпустить небольшую раму, содержащую координаты выбранной точки, каждый раз, когда мы нажимаем на него.

Вот наша конечная цель – Интерактивный график, который аннотирует точку, которую вы нажимаете на :

И вот код, который мы обсудим в этой статье, что приводит к этому выпуску:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Cursor

#x and y arrays for definining an initial function
x = np.linspace(0, 10, 100)
y = np.exp(x**0.5) * np.sin(5*x)

# Plotting
fig = plt.figure()
ax = fig.subplots()
ax.plot(x,y, color = 'b')
ax.grid()

# Defining the cursor
cursor = Cursor(ax, horizOn=True, vertOn=True, useblit=True,
                color = 'r', linewidth = 1)

# Creating an annotating box
annot = ax.annotate("", xy=(0,0), xytext=(-40,40),textcoords="offset points",
                    bbox=dict(boxstyle='round4', fc='linen',ec='k',lw=1),
                    arrowprops=dict(arrowstyle='-|>'))
annot.set_visible(False)

# Function for storing and showing the clicked values
coord = []
def onclick(event):
    global coord
    coord.append((event.xdata, event.ydata))
    x = event.xdata
    y = event.ydata
    
    # printing the values of the selected point
    print([x,y]) 
    annot.xy = (x,y)
    text = "({:.2g}, {:.2g})".format(x,y)
    annot.set_text(text)
    annot.set_visible(True)
    fig.canvas.draw() #redraw the figure

    
fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

# Unzipping the coord list in two different arrays
x1, y1 = zip(*coord)
print(x1, y1)

Импорт библиотек

Как начать, мы импортируем библиотеки и пакеты, которые будут использоваться в этом примере. Мы будем использовать Numpy Для определения начальной функции, которая будет отображаться с использованием matplotlib.pyplot Отказ Наконец, от matplotlib.widget Пакет, мы импортируем функцию Курсор, который будет использоваться для создания интерактивного курсора.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Cursor

Определение начальной функции для сюжета

Для того, чтобы использовать наш курсор на реальном сюжете, мы вводим начальную функцию, определяя два Numpy Массивы, «X» и «Y». Массив «X» определяется путем эксплуатации Numpy Функция .linspace () , который будет генерировать массив из 100 одинаково расположенных номеров от 0 до 10. Массив «Y» определяется следующей функцией:

Оба грех () и экспоненциальная функция вводится с использованием Numpy. Конечно, это только один из возможных примеров, любая функция хороша для конечной цели этой статьи. Все эти процедуры описаны в следующих строках кода.

#x and y arrays
x = np.linspace(0, 10, 100)
y = np.exp(x**0.5) * np.sin(5*x)

Построение функции

На следующем шаге мы определяем окно построения и постройте нашу функцию. С этой целью мы полностью полагаемся на matplotlib.pyplot упаковка.

#Plotting
fig = plt.figure()
ax = fig.subplots()
ax.plot(x,y, color = 'red')
ax.grid()

Определение курсора

Курсор
Синтаксис: Курсор()
Параметры: топор (переменная) Оси, определяющие пространство, в котором кнопка будет расположена
Горизонт (Bool) Рисование горизонтальной линии
Эвертон (книга) Рисование вертикальной линии
useblit (bool) Используйте Blating для улучшения производительности
Цвет (ул или поплавок) Цвет линий
Визит (float) Ширина курсора
Возвращаемое значение Никто

Чтобы представить курсор на нашем сюжете, мы сначала должны определить все его свойства; Для этого мы используем функцию Курсор, от matplotlib.widget упаковка.

Функция принимает в качестве ввода оси, в которых мы хотим отображать курсор («топор» в этом случае) и другие свойства самого курсора; а именно горизонт и Вертон , которые генерируют горизонтальную и вертикальную линию, которая однозначно идентифицирует курсор, в то время как он находится на графике; Их значение может быть установлено на Правда или Ложь В зависимости от того, как мы хотим идентифицировать курсор.

Также возможно указать некоторые свойства линии, как цвет и толщина (с использованием linewidth ) Отказ

Последний входной параметр – useblit , Мы установили это на Правда Так как он обычно улучшает производительность интерактивных фигур по «Не делать работу, нам не нужно» (Если вы заинтересованы в процессе блеска, пожалуйста, посетите: https://matplotlib.org/3.3.1/tutorials/advanced/bliting.html ).

Все входные параметры функции Курсор суммированы в Таблица 1 И дополнительная документация можно найти по адресу: https://matplotlib.org/3.3.3/api/widgets_api.html . Отказ

Все свойства, определенные в функции Курсор, назначены переменной «курсор».

#defining the cursor
cursor = Cursor(ax, horizOn = True, vertOn=True, color='red', linewidth=1, 
                useblit=True)

На данный момент мы завершили определение нашего курсора, если бы мы показать сюжет, мы получим результат, отображаемый на рисунке 1.

На следующих шагах мы увидим, как определить структуру, содержащую координаты выбранной точки, которая будет выпущена на каждом щелчке мыши. Если вы не заинтересованы в этой функции, вы можете пропустить следующий раздел, в котором мы увидим, как хранить и распечатывать значения, выбранные курсором.

Создание аннотированных каркасов

Аннотировать
Синтаксис: Annotate ()
Параметры: Текст (ул) Текст аннотации
xy (поплавок, плавать) Точка для аннотата
xytext (float, float) Позиция для размещения текста на
Textcoords. Система координат, которую Xytext приведен в
bbox. Установка рамы
arrowproops. Установка стрелки
Возвращаемое значение Никто

Таблица 2: Отказ Annotate () Функция и все входные параметры, используемые в настоящем примере.

Как ожидалось, во введении, мы хотим улучшить графический результат и эффективность нашего курсора путем выскакивания в небольших каркасах, содержащих координаты выбранной точки, на каждом щелчке мыши.

Для этого мы используем функцию matplotlib .annotate () , Что обеспечивает множество различных функций для настройки аннотаций в рамках сюжета (здесь можно найти дополнительную документацию: https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.axes.axes.annotate.html ).

Первый входной параметр .annotate () Функция – это текст, который появится в аннотации; Введем пустую строку, так как мы добавим текст позже (он изменится на каждом клике мыши).

Затем указываем свойства ” xy “, ” xytext ” и ” textcoords “, с которыми мы определяем контрольную точку, расстояние текста с этого момента и как рассчитано расстояние (В нашем случае подсчет численных значений в точках, пиксель также доступен) соответственно.

Чтобы лучше выделить аннотацию на сюжете, мы также добавляем внешнюю структуру, используя Bbox и прохождение всех свойств структуры (например, наполнение цвета, EdgeColor и LineWidth) в виде клавиш и значений A Словарь Отказ

Наконец, мы генерируем стрелку, идущую от « XY » – « xytext » аналогичным образом (все свойства для стрелок можно найти в . Annotate документация). Свойства аннотации, только что определенные, затем назначаются переменной « Annot »; Используя метод .set_visible () , Видимость рамки аннотации изначально устанавливается на Ложь (Это появится только после щелчка мыши).

Все параметры, используемые в определении .annotate () Функция суммирована в таблице 2.

#Creating the annotation framework
annot = ax.annotate("", xy=(0,0), xytext=(-40,40),textcoords="offset points",
                    bbox=dict(boxstyle="round4", fc="grey", ec="k", lw=2),
                    arrowprops=dict(arrowstyle="-|>"))
annot.set_visible(False)

Хранение и отображение координат выбранной точки

Курсор сейчас работает, но ничего не происходит, когда мы нажимаем на сюжет. В этом разделе мы определяем функцию, которая распечатает и хранит координаты точки, щелкнувшись на участке; Он также будет отображать ранее определенную аннотированную коробку.

Хранение значений вне функции

Мы определяем пустой список, называемый «CORD», в котором будут сохранены координаты всех точек нажатия.

После этого мы начинаем определять новую функцию, она будет называться «OnClick». Вход функции установлен на Событие, Для доступа к положению индикатора на участке.

В рамках функции определяется глобальная переменная под названием «CORD», это сделано для хранения значений, сгенерированных в функции, и иметь их доступность также в переменной «Координации» вне функции. Чтобы сохранить координаты выбранной точки, мы добавляем переменные Event.xdata и Event.ydata , как кортеж, к списку координат; Таким образом, значения будут доступны даже вне функции. Ради простоты мы тогда назначаем их двум разным локальным переменным «X» и «Y».

Печать ценностей координат

На данный момент мы также можем распечатать их значение, просто набрав Печать () команда.

Отображение координат точек в коробке аннотирования

Следующая функция, которую мы можем добавить к функции, предназначено для отображения аннотированной коробки, содержащей значения «X» и «Y». Для этой задачи значения «X» и «Y» сначала используются для определения положения коробки аннотирования, изменяя XY Свойство переменной «Annot», а затем определить переменную «текст», строку, которая содержит текст аннотации. Чтобы изменить текст переменной «annot», мы используем метод. set_text (), Ввод, как единственный входной параметр, переменная «текст».

Мы заключаем, изменив видимость функции «Annot» для True и перерисовая фигуру. Следующие строки кода отображают все определение функции, следуя тому же порядку, используемым в приведенном выше описании.

#Function for storing and showing the clicked values
coord = []
def onclick(event):
    global coord
    coord.append((event.xdata, event.ydata))
    x = event.xdata
    y = event.ydata
    print([x,y])
    annot.xy = (x,y)
    text = "({:.2g},{:.2g})".format( x,y )
    annot.set_text(text)
    annot.set_visible(True)
    fig.canvas.draw() #redraw the figure

Чтобы соединить событие нажатия с выполнением функции «OnCrick», мы используем метод MATPLOTLIB .mpl_connect (), Связывание его с событием «Button_Press_Event». Мы наконец построим рисунок. На рисунке 2 отображается окончательный результат.

Доступ к хранимым значениям вне функции

Поскольку координаты выбранных точек были сохранены в списке «Координация», теперь можно иметь доступ к своим значениям, просто обработая список стандартных функций. Одним из примеров является использование функции .zip (*) , В котором мы вводим имя списка после звездочки, чтобы расстегнуть все кортежи на две разные массивы «X1» и «Y1».

#unzipping the x and y values of the selected points
x1, y1 = zip(*coord)

Вывод

В этой статье мы видели, как ввести курсор в окно MATPLOTLIB, как настроить его свойства и внешний вид. Мы также изучили возможность создания аннотированной коробки и как отобразить его на каждом щелчке мыши.

Все эти функции предоставит дополнительное значение ваших участков как из эстетической, так и функциональной точки зрения, что делает их более приятными и понятными, два фундаментальных аспекта, которые всегда обладают, что каждый отчет о науке данных должен всегда обладать.