交互式更改matplotlib绘图的透明度值

3 投票
1 回答
812 浏览
提问于 2025-04-18 16:12

我看过文档,但还是搞不清楚这是否可行 -

我有一个数据集,其中包含 xy 的值,还有离散的 z 值。多个 (x,y) 对会共享相同的 z 值。我想要实现的是,当我鼠标悬停在一个特定 z 值的点上时,所有具有相同 z 值的点的透明度 alpha 都变为 1 - 也就是说,如果所有的透明度最初都是 0.5,我希望只有那些具有相同 z 值的点的透明度变为 1。

这里有一个简单的示例来说明我所说的内容:

#! /usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

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

z   = np.arange(0, 10, 1)
z   = np.repeat(z, 10)

im = plt.scatter(x, y, c=z, alpha = 0.5)
plt.colorbar(im)
plt.show()

1 个回答

0

你可以通过使用第二个图表来假装实现你想要的效果:

import numpy as np
import matplotlib.pyplot as plt

Z = np.zeros(1000, dtype = [("Z", int), ("P", float, 2)])
Z["P"] = np.random.uniform(0.0,1.0,(len(Z),2))
Z["Z"] = np.random.randint(0,50,len(Z))

def on_pick(event):
    z = Z[event.ind[0]]['Z']
    P = Z[np.where(Z["Z"] == z)]["P"]
    selection_plot.set_data(P[:,0],P[:,1])
    plt.draw()


fig = plt.figure(figsize=(10,10), facecolor='white')
fig.canvas.mpl_connect('pick_event', on_pick)
ax = plt.subplot(111, aspect=1)
ax.plot(Z['P'][:,0], Z['P'][:,1], 'o', color='k', alpha=0.1, picker=5)

selection_plot, = ax.plot([],[], 'o', color='black', alpha=1.0, zorder=10)
plt.show()

撰写回答