【问题标题】:Interactively changing the alpha value of matplotlib plots交互式更改 matplotlib 绘图的 alpha 值
【发布时间】:2025-12-28 14:45:09
【问题描述】:

我查看了文档,但我似乎无法弄清楚这是否可行 -

我有一个数据集,包含 xy 值和离散的 z 值。多对 (x,y) 共享相同的 z 值。我想要做的是当我将鼠标悬停在具有特定z 值的一个点上时,具有相同z 值的所有点的alpha 变为1 - 。如果所有alpha 值最初为 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()

【问题讨论】:

  • 最简单的方法是传入每个标记的 RGBA 值列表。 alpha kwarg 在合成期间适用于整个艺术家。
  • @tcaswell 我对此进行了简单的实验——虽然可以为每个点设置单独的 RGB 值,但似乎为集合设置的全局 alpha 值会覆盖对 alpha 通道的任何手动更改每个点。
  • 我的理解是它们堆叠在一起
  • 查看 *.com/questions/25089068/…github.com/matplotlib/matplotlib/issues/3343 以及所包含的链接,了解 mpl 如何进行 alpha 混合的信息比您想知道的更多。

标签: python matplotlib


【解决方案1】:

您可能可以使用第二个情节伪造您想要实现的目标:

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()

【讨论】: