matplotlib 在子图上拾取-无法提取元数据

db2dz4w8  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(119)

如果我有一些术语错了,我道歉。
我试图建立一个选择器,让我/未来的用户可以为一个相对较大的数据集(1000行,10行)切片一个框架。
理想情况下,目标是将每个子图的x坐标传递给字典,其中dict.keys将是子图编号,例如,0表示第一个,1表示第二个等
一个额外的复杂性是,我在不同的数据集上有不同数量的子图,所以我希望它能自动分配这些标签。
到目前为止,我已经将我的“returned_points”设置为嵌套列表。现在,我可以做的是将“click”传递给这个列表(列表),并将字符串分配给子图的正确索引。我还可以将点信息传递给一个“flat”列表,该列表不告诉我点来自哪个子图。
我不能做的是让艺术家数据-我的意思是我点击的图中的点的值-被传递到嵌套列表中的正确列表。
我一直在跟踪这些问题的示例:herehere和matplotlib演示here
MWE:

def test1(event):
    for i in list(range(len(fig.axes))):
        if event.inaxes == fig.axes[i]:
            test[i].append("click")

def test2(event):
    for i in list(range(len(fig.axes))):
        if event.inaxes == fig.axes[i]:
            thisline = event.artist
            xdata = thisline.get_xdata()
            ind = event.ind
            vals[i].append(xdata[ind])

x = np.random.rand(100)
y = np.random.rand(100)

fig, ax = plt.subplots(2,1)

test = [[] for i in fig.axes]
vals = [[] for i in fig.axes]

for ax in fig.axes:
    ax.plot(x, y, "o")
    fig.canvas.mpl_connect("button_press_event",test1)
    fig.canvas.mpl_connect("button_press_event",test2)

print(test)
print(vals)

在顶部图中单击四次,在下部图中单击一次将返回:

[['click', 'click', 'click', 'click'], ['click']] # passing a string works fine
[[], []] # getting the artist data to write to the list does not work...

基本的“平面”版本:

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ind = event.ind
    picker_tmp.append(xdata[ind])

fig, ax = plt.subplots(2,1)

picker_tmp = []

for ax in fig.axes:
    ax.plot(x, y, "o", picker=True)

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

print(picker_tmp)

提供:

[array([0.249527]), array([0.36171572]), array([0.47993459]), array([0.8400918]), array([0.4248754])] 

# getting artist data works fine here?!...
rqenqsqc

rqenqsqc1#

感谢@TrentonMcKinney指出错误。我混淆了“pick_event”和“button_press_event”。不知道为什么“pick_event”不适用于此。
工作代码:

def test(event):
    for i in list(range(len(fig.axes))):
        if event.inaxes == fig.axes[i]:
            vals[i].append(round(float(event.xdata), 0))
            
x = np.random.rand(10)*10
y = np.random.rand(10)*10

fig, ax = plt.subplots(4,1)

vals = [[] for i in fig.axes]
    
for ax in fig.axes:
    ax.plot(x, y, "o", picker=True)
    
    fig.canvas.mpl_connect('button_press_event',test)

相关问题