更新pyplot.scatter的坐标和颜色

9 投票
1 回答
5045 浏览
提问于 2025-04-18 08:07

我一直在为这个问题苦恼,怎么也搞不定。我正在分块读取一个文件,并从中绘制散点图,我想通过在一个for循环中更新散点图来“动画化”这个过程(还想把它适应成实时数据流)。

所以像下面这个不太好看的例子可以用来绘制单个图:

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]
alpha = [0.2, 0.3, 0.8, 1.0]
c = np.asarray([(0, 0, 1, a) for a in alpha])
s = scatter(x, y, marker='o', color=c, edgecolors=c)

上面图的绘制

但是我该如何更新这个图,而不需要反复调用s.remove()scatter()呢?那些名字听起来完全不直观的s.set_arrays.set_offsets应该是用来更新颜色和x、y位置的,但我就是搞不懂怎么用它们来处理我上面提到的x、y和alpha数据。

(另外,上面图中的alpha值有没有更好的处理方法?)

1 个回答

5

我找到的解决办法是使用Normalize来创建一个基于相关数据的标准化颜色列表,然后把这个列表映射到一个ScalarMappable上,接着用它来设置动画中每一帧的面颜色和颜色范围。这里的scat是散点图的句柄,而speedsList则提供了颜色数据:

n = mpl.colors.Normalize(vmin = min(speedsList), vmax = max(speedsList))
m = mpl.cm.ScalarMappable(norm=n, cmap=mpl.cm.afmhot)
scat.set_facecolor(m.to_rgba(speedsList))
scat.set_clim(vmin=min(speedsList), vmax=max(speedsList))

这样做的效果正是我所期待的。

撰写回答