Matplotlib 散点图交互性不起作用

Posted

技术标签:

【中文标题】Matplotlib 散点图交互性不起作用【英文标题】:Matplotlib Scatter plot interactivity not working 【发布时间】:2021-12-25 09:08:51 【问题描述】:

直到今天早上,当我将点悬停在散点图上时,我才能够显示标签信息。 现在,如果我运行以下代码,它不会显示任何错误,但交互性不起作用,并且看起来 mplconnect 或 mlpcursors 完全被忽略了。 我在 windows 和 Fedora 下尝试过相同的代码。 不明白发生了什么。

从 matplotlib.pyplot 导入图,显示 将 numpy 导入为 npy 从 numpy.random 导入 rand

    x, y, c, s = rand(4, 100)
    def onpick3(event):
        ind = event.ind
        print('onpick3 scatter:', ind, npy.take(x, ind), npy.take(y, ind))

    fig = figure()
    ax1 = fig.add_subplot(111)
    col = ax1.scatter(x, y, 100*s, c, picker=True)
    #fig.savefig('pscoll.eps')
    fig.canvas.mpl_connect('pick_event', onpick3)

show()

或者

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

x = np.random.rand(15)
y = np.random.rand(15)
names = np.array(list("ABCDEFGHIJKLMNO"))
c = np.random.randint(1,5,size=15)

norm = plt.Normalize(1,4)
cmap = plt.cm.RdYlGn

fig,ax = plt.subplots()
sc = plt.scatter(x,y,c=c, s=100, cmap=cmap, norm=norm)

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)

def update_annot(ind):

    pos = sc.get_offsets()[ind["ind"][0]]
    annot.xy = pos
    text = ", ".format(" ".join(list(map(str,ind["ind"]))), 
                           " ".join([names[n] for n in ind["ind"]]))
    annot.set_text(text)
    annot.get_bbox_patch().set_facecolor(cmap(norm(c[ind["ind"][0]])))
    annot.get_bbox_patch().set_alpha(0.4)


def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax:
        cont, ind = sc.contains(event)
        if cont:
            update_annot(ind)
            annot.set_visible(True)
            fig.canvas.draw_idle()
        else:
            if vis:
                annot.set_visible(False)
                fig.canvas.draw_idle()

fig.canvas.mpl_connect("motion_notify_event", hover)

plt.show()

这不是我的代码,我是从网站上复制粘贴的,但行为是一样的。

【问题讨论】:

【参考方案1】:

Plotly express 解决问题

将 plotly.express 导入为 px

alpha = data[data['Ticker']==focus].V1
gamma = data[data['Ticker']==focus].V2

fig = px.scatter(data, x='V1', y='V2', color=Colors.Market_Cap, hover_data=["Ticker"] )
fig.add_shape(type="circle",
    xref="x", yref="y",
    x0=int(alpha-3), y0=int(gamma-3), x1=int(alpha+3), y1=int(gamma+3),
    line_color="LightSeaGreen",
)

fig.show()

【讨论】:

以上是关于Matplotlib 散点图交互性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在matplotlib散点图中规范化色彩映射?

使用“大小”参数时调整散点图中的标记大小

使用 NaN 绘制/创建数据集的散点图

Python数据可视化——使用Matplotlib创建散点图

散点图错误:“x 和 y 的大小必须相同”但它们的大小相同

将数据从散点图传输到 lineEdit - Matplotlib 和 Pyqt5