如何在matplotlib中区分散点图上的数据点

3

我有两个pandas数据框,data1data2

它们显示在图表上。我可以点击点以显示该点的信息。但只能从一个数据集中获取。如何同时使用两个数据集? 另外,我需要通过索引访问数据以显示来自另一个数组的信息。

from matplotlib.pyplot import figure, show

import pandas as pd
# I want to show infrotmation from these dataframes data using indexes on click
initial_data1 = pd.read_csv("data1.csv")
initial_data2 = pd.read_csv("data2.csv")

data1 = initial_data1.copy()
data2 = initial_data2.copy()

data1 = SomeProcessing(data1) #I use this data to make a plot
data2 = SomeProcessing(data2) #I use this data to make a plot

def showScatter():
    def onpick3(event):
        ind = event.ind
        display(initial_data2.loc[ind])

    fig = figure()
    ax1 = fig.add_subplot(111)
    col = ax1.scatter(data1[:,0], data1[:,1], picker=True)
    col = ax1.scatter(data2[:,0], data2[:,1], marker="+", color = 'black', picker=True)
for i in range(len(data2)):
        ax1.annotate(i, (data2[i,0], data2[i,1]))

    fig.canvas.mpl_connect('pick_event', onpick3)
    show()
1个回答

1

使用event.artist来确定给定索引event.ind所属的轴中的哪个艺术家。然后可以使用此艺术家来确定接下来要做什么。

import numpy as np
import matplotlib.pyplot as plt

def showScatter(data, otherdata):
    def onpick(event):
        ind = event.ind[0]
        artist = event.artist
        d = otherdata[scatters.index(artist)]
        ax.set_title("You clicked {}".format(d[ind]))

    fig, ax = plt.subplots()
    scatters = []

    for d in data:
        sc = ax.scatter(d[:,0], d[:,1], picker=True)
        scatters.append(sc)
        for i in range(len(d)):
            ax.annotate(i, (d[i,0], d[i,1]), xytext=(0,3),
                        textcoords="offset points", ha="center", va="baseline")

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


x,y = np.meshgrid(np.arange(10), np.arange(6))
ind = np.random.randint(0,2,size=6*10).astype(bool)
data1 = np.column_stack((x.flatten()[ind], y.flatten()[ind]))
data2 = np.column_stack((x.flatten()[~ind], y.flatten()[~ind]))
cid = showScatter((data1, data2), (data1, data2))
plt.show()

谢谢您的回答!但是如何获取初始数据数组的索引? - cuga
“初始数据数组”是什么?在上面的答案中,您索引了属于所点击点的数组。如果您单击蓝色点,则使用索引来索引蓝色点的数组,橙色点同理。 - ImportanceOfBeingErnest
我理解了。问题是我需要这个索引用于另一个数组。我对它进行了一些转换并显示了散点图。当点击时,我想显示来自初始数组的信息。对于不清楚的解释,我很抱歉,并将编辑问题。 - cuga
从问题中并不清楚 initial_datadata1data2 中的任何一个有何关系。 - ImportanceOfBeingErnest
嗯,我不知道 SomeProcessing 做了什么。但是假设它保持数据的顺序和长度不变,你只需将初始数据一并提供给函数,并在需要时使用它即可。我更新了答案(对两者都采用相同的数据)。 - ImportanceOfBeingErnest
现在我明白了。索引实际上是存在的。谢谢,一切都正常工作并且完美运行! - cuga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接