Как сделать так, чтобы matplotlib открывал окно для комментариев пользователей?
У меня есть интерактивный график, который прослушивает определенные нажатия клавиш и клики, но я хочу, чтобы пользователь мог добавить комментарий. Я знаю, что события артистов обычно не позволяют этого (они слушают отдельные нажатия! Но могу ли я заставить matplotlib открыть новое окно с небольшой областью "вставить комментарий"? В идеале, окно выходит и возвращается к основному (оригинал)) окно, когда пользователь нажимает возврат.
import numpy as np
import matplotlib.pyplot as plt
def onpick(event):
''' '''
if event.mouseevent.button == 1: #only want lmb clicks
selection = event.artist
xdata = selection.get_xdata()
ydata = selection.get_ydata()
ind = event.ind
point = tuple(zip(xdata[ind], ydata[ind]))
xclick,yclick = point[0]
print('[x,y]=',xclick,yclick)
def on_key(event):
'''
Handles predefined key-press events
'''
print('Key press:\'%s\'' %(event.key))
if event.key == ' ': #spacebar
print 'Space'
#do a thing
if event.key == 'e':
print 'eeeeee'
#do another thing
if event.key == 'C':
print 'How do make a comment. ...'
comment = 'Whatever the user entered'
return comment
# when done return
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, facecolor='#FFFFCC')
x, y = 4*(np.random.rand(2, 100) - .5)
ax.plot(x, y, 'o', picker = 6)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
keyID = fig.canvas.mpl_connect('key_press_event', on_key)
clickID = fig.canvas.mpl_connect('pick_event', onpick)
plt.show()
1 ответ
Решение
Matplotlib скоро представит виджет TextBox. Посмотрите его использование в этом примере.
Кроме того, вы можете использовать Tkinter's tkSimpleDialog
попросить пользователя за комментарий.
w = tkSimpleDialog.askstring("Title", "Please type comment")
Затем вы можете аннотировать последний выбранный пункт с комментарием.
Полный пример (который работает в Python 2.7):
import numpy as np
import matplotlib.pyplot as plt
import Tkinter, tkSimpleDialog
xy = [(0,0)]
def onpick(event):
''' '''
if event.mouseevent.button == 1: #only want lmb clicks
selection = event.artist
xdata = selection.get_xdata()
ydata = selection.get_ydata()
ind = event.ind
point = tuple(zip(xdata[ind], ydata[ind]))
xclick,yclick = point[0]
xy[0] = (xclick,yclick)
print('[x,y]=',xclick,yclick)
def on_key(event):
print('Key press:\'%s\'' %(event.key))
if event.key == 'c':
root = Tkinter.Tk()
root.withdraw()
w = tkSimpleDialog.askstring("Title", "Please type comment")
if w != None:
ax.annotate(w, xy=xy[0], xytext=(20,-20),
arrowprops=dict(facecolor='black', width=2, headwidth=6),
textcoords='offset points')
ax.figure.canvas.draw_idle()
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, facecolor='#FFFFCC')
x, y = 4*(np.random.rand(2, 100) - .5)
ax.plot(x, y, 'o', picker = 6)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
keyID = fig.canvas.mpl_connect('key_press_event', on_key)
clickID = fig.canvas.mpl_connect('pick_event', onpick)
plt.show()