Событие клика с гистограммой Matplotlib - PullRequest
0 голосов
/ 10 июня 2019

Я использую Matplotlib для построения гистограммы с накоплением и хочу отобразить метку данных, по которым щелкнули.

Я написал код для отображения меток для простого линейного графика.Когда я пытаюсь сделать то же самое с гистограммой, и это не работает.Ниже приведен код, который работает с линейным графиком.

import numpy as np
import matplotlib.pyplot as plt

# plots port counts per address as a stacked bar graph
fig=plt.figure()
ax=fig.add_subplot(111)
text=ax.text(0,0, '', va='baseline', ha='left')

# plot 
y=np.array([[1,2,3],[4,5,6]])

for i in range(2):
    ax.plot(y[i, :], gid=i)

def on_click(event):
    for curve in ax.get_lines():
        if curve.contains(event)[0]: gid=curve.get_gid()
    text.set_text('Class %s' % gid)

fig.canvas.mpl_connect('button_press_event', on_click)

Когда я щелкаю линию, отображается ее метка (gid), как показано на рисунке ниже.enter image description here

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

# plots port counts per address as a stacked bar graph
fig=plt.figure()
ax=fig.add_subplot(111)
text=ax.text(0,0, '', va='baseline', ha='left')
bottom=np.array([0,0,0])

# plot 
x_pos=np.arange(3)
y=np.array([[1,2,3],[1,3,5]])

for i in range(2):
    ax.bar(x_pos, y[i, :], align='center', bottom=bottom, alpha=0.5, gid=i)

    # update the bar bases for the next iteration
    bottom=np.add(bottom,y[i, :] )

def on_click(event):
    gid='-'
    for curve in ax.get_lines():
        gid='TEST'
        if curve.contains(event)[0]: 
            gid=curve.get_gid()
    text.set_text('Class %s' % gid)

fig.canvas.mpl_connect('button_press_event', on_click)

Я предполагаю, что ax.bar не создает строки для повторной настройки get_lines, следовательно, он выходит из цикла for curve in ax.get_lines() с0 итераций, из-за того, как задан текст при нажатии на диаграмму, как показано на рисунке ниже.

enter image description here

Я хотел бы знать, как я могуотобразить метку, щелкнув столбчатую диаграмму с накоплением.

1 Ответ

0 голосов
/ 10 июня 2019

Понятие о том, в каком исполнителе содержится событие мыши, полезно при использовании наведения, например, Как комментировать значения X и Y при наведении мыши на гистограмму

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

Таким образом, следующее работает для обоих случаев.При нажатии на первые столбцы отображается «Панель классов: 0», а для первой строки - «Строка класса: 0».

import numpy as np
import matplotlib.pyplot as plt

# plots port counts per address as a stacked bar graph
fig=plt.figure()
ax=fig.add_subplot(111)
text=ax.text(0,0, '', va='baseline', ha='left')
bottom=np.array([0,0,0])

# plot 
x_pos=np.arange(3)
y=np.array([[1,2,3],[1,3,5]])

for i in range(2):
    ax.bar(x_pos, y[i, :], align='center', bottom=bottom, alpha=0.5, gid=f"bar: {i}", picker=4)
    ax.plot(y[i, :], gid=f"line: {i}", picker=4)
    # update the bar bases for the next iteration
    bottom=np.add(bottom,y[i, :] )

def on_click(event):
    text.set_text(f"Class {event.artist.get_gid()}")
    fig.canvas.draw_idle()

fig.canvas.mpl_connect('pick_event', on_click)

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