gpt4 book ai didi

python - 在 matplotlib 中使用 mpldatacursor 的工具提示

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:21 26 4
gpt4 key购买 nike

为此,我已经费了好大劲了。我正在尝试使用 mpldatacursormatplotlib 一起提供散点图的工具提示功能。每个点都有一些与之相关的数据,我想在单击该点时显示这些数据。

这是一个最小的(不是)工作示例:

import numpy as np
import mpldatacursor
import string
import matplotlib
matplotlib.use('Qt5Agg')
from matplotlib import pyplot as mpl

nations = ['Russia', 'America', 'China', 'France']
data = list()
idx = list()

np.random.seed(42) #Seed for repeatability

# Random data
for (id, nation) in enumerate(nations):
for i in range(0,10):
data.append((id+1)*np.random.random((2,1)))
name = list(string.ascii_uppercase[20:])
np.random.shuffle(name)
idx.append(nation + '-' + ''.join(name))

mpl.figure()
data = np.squeeze(np.asarray(data))
m, n = 0, 9

# Plot by group
for (id,nation) in enumerate(nations):
mpl.scatter(data[m:n,0] , data[m:n,1] , label=nation)
m = n + 1
n += 10

formatter = lambda **kwargs: ', '.join(kwargs['point_label'])
mpl.legend()
mpldatacursor.datacursor(formatter=formatter, point_labels=idx)
mpl.show(block=True)

但是当我这样做时,工具提示与图例不匹配。此外,图中仅显示以 RussiaUSA 开头的标签。我做错了什么?

enter image description here

最佳答案

通常,您会将数据放在一个表中,或者为了示例的目的,将数据放在多个列表中。因此,人们可能会根据数据列创建一个散点图,并使用名称到数字的映射来创建散点图中的颜色。

然后可以使用 matplotlib pick_event 从相应列表中获取数据,给定发生点击的点的索引。

这一切都不需要任何外部包,如 datacursor。

import numpy as np; np.random.seed(42)
import string
from matplotlib import pyplot as plt

nations = ['Russia', 'America', 'China', 'France']

#Create lists data, nat, idx
nat = np.random.choice(nations, 50)
data = np.random.rand(50,2)
strings = ["".join(np.random.choice(list(string.ascii_uppercase), 7)) for _ in range(50)]
idx = ["{}-{}".format(n,w) for n,w in zip(nat,strings)]

labels, i = np.unique(nat, return_inverse=True)

fig, ax = plt.subplots()


scatter = ax.scatter(data[:,0], data[:,1], c=i, cmap="RdYlGn", picker=5)

rect = lambda c: plt.Rectangle((0,0),1,1, color=scatter.cmap(scatter.norm(c)))
handles = [rect(c) for c in np.unique(i)]
plt.legend(handles, labels)

#Create annotation
annot = ax.annotate("", xy=(0,0), xytext=(-20,20),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)

#Create event handler
def onpick(evt):
if evt.artist == scatter:
ind = evt.ind[0]
annot.xy = (data[ind])
annot.set_text(idx[ind])
annot.set_visible(True)
if evt.mouseevent.button == 3:
annot.set_visible(False)
fig.canvas.draw_idle()

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

plt.show()

enter image description here

关于python - 在 matplotlib 中使用 mpldatacursor 的工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50840879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com