Jupyter中的pick_event与matplotlib散点图

时间:2018-07-26 17:01:23

标签: matplotlib jupyter-notebook

我真的很喜欢ipywidgets.interactive与pandas数据框一起使用的简单性,但是当在散点图中选择一个点时,我很难获取数据。

我看过一些使用matplotlib.widgets等的示例,但是没有一个示例在Jupyter中将其与交互一起使用。看起来这里将描述这种技术,但是它很简短:

http://minrk-ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html

以下是我要完成的工作:

from ipywidgets import interactive
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
from matplotlib.text import Annotation
from io import StringIO

data_ssv = """tone_amp_0  tone_freq_0     SNR
75.303        628.0  68.374
84.902       8000.0  61.292
92.856        288.0  70.545
70.000       2093.0  35.036
76.511       6834.0  66.952 """

data = pd.read_table(StringIO(data_ssv), sep="\s+", header=0)

col_names=list(data.columns.values)
plottable_col=( ['tone_amp_0', 'tone_freq_0', 'SNR'] )

def annotate(axis, text, x, y):
    text_annotation = Annotation(text, xy=(x, y), xycoords='data')
    axis.add_artist(text_annotation)

def onpick(event):
    ind = event.ind
    label_pos_x = event.mouseevent.xdata
    label_pos_y = event.mouseevent.ydata
    offset = 0   # just in case two dots are very close, this offset will help the labels not appear one on top of each other

    for i in ind:  # if the dots are to close one to another, a list of dots clicked is returned by the matplotlib library
        label = "gen_labels" # generated_labels[i]
        print( "index", i, label )    # step 4: log it for debugging purposes
        ax=plt.gca()
        annotate(ax,label,label_pos_x + offset,label_pos_y + offset)
        ax.figure.canvas.draw_idle()
        offset += 0.01 # alter the offset just in case there are more than one dots affected by the click


def update_plot(X='tone_amp_0', Y='tone_frq_0', Z='SNR'):
    plt.scatter(  data.loc[:, [X]],data.loc[:, [Y]], marker='.', edgecolors='none', c=data.loc[:,[Z]], picker=True, cmap='RdYlGn' )
    plt.title(X+' vs '+Y); plt.xlabel(X); plt.ylabel(Y); plt.colorbar().set_label(Z, labelpad=+1)
    plt.grid(); plt.show()

plt.gcf().canvas.mpl_connect('pick_event', onpick)

interactive(update_plot, X=plottable_col, Y=plottable_col, Z=plottable_col)

当我选择一个数据点时,什么都没有发生。不知道该如何调试或了解我在做什么错。有人可以指出我在这里做错了吗?

1 个答案:

答案 0 :(得分:-1)

尝试将分号放在plt.gcf().canvas.mpl_connect('pick_event', onpick)的末尾。