python - 由边连接的点的动画图

标签 python matplotlib

我有一个与此类似的问题 question ,但我没有绘制大量的点,而是使用更少的点和边(至少 10 倍),但想要为它们设置动画。更具体地说,它是具有 2D map 的 Kohonen 网络的可视化,它演化并看起来像变形的方格,请参阅维基百科的这张图片:

image

代码取自this答案修改了一下,一个最小的例子是这样的:

import numpy as np
import matplotlib.pyplot as plt

def getXY(points, edges):
   """Return x and y arrays to pass to the plot function"""
   return [points.T[i][edges.T] for i in np.arange(points.shape[1])]

points = numpy.array([[1,2],[4,5],[2,7],[3,9],[9,2]])
edges = numpy.array([[0,1],[3,4],[3,2],[2,4]])

lines = plt.plot(*getXY(points, edges), linestyle='-', color='y',
        markerfacecolor='red', marker='o')
plt.show()

然后,会发生更改点坐标的更新:

points += 1 # simplified version of a real update

我想避免重新绘制所有内容的“愚蠢”方式,因为绘图窗口中还有其他数据不会改变,而且这真的很慢:

# repeat after each update all the calculation
plt.cla()
x, y = [points.T[i][edges.T] for i in np.arange(points.shape[1])]
lines = plt.plot(x, y, linestyle='-', color='y',
        markerfacecolor='red', marker='o')
plt.show()

作为第一步,我将创建的 Line2D 数据从初始绘图保存在变量 lines 中。 我现在面临的问题是,如果我只想更新行数据,我能想出的唯一解决方案要求我遍历所有行,这对我来说似乎不太优雅:

x, y = getXY(points, edges)
if len(lines) > 1: 
    for i, d in enumerate(zip(x.T, y.T)):
        lines[i].set_data(d)
else: # has to be treated seperately, since the format of x and y is different
    lines[0].set_data(x, y)
plt.show()

我正在寻找如何...的建议

  • 提出比我的 for 循环更好的解决方案
  • 关于如何以更优雅的方式解决初始问题(绘制具有指定连接的点)的想法

最佳答案

这是一种可能的方法。您可以使用这样一个事实,即如果在线的坐标中有 NaN 或 None,则这实际上被视为线段的末端。下一个非 None 点被视为新段的开始。

import numpy as np, matplotlib.pyplot as plt
x,y = np.array([1, 4,2, 3, 9]), np.array([2, 5, 7, 9, 2])

edges = np.array([[0, 1],
   [3, 4],
   [3, 2],
   [2, 4],
   [2, 1]])

ys=np.vstack((y[edges[:,0]],y[edges[:,1]],y[edges[:,0]]+np.nan)).T.flatten()

xs=np.vstack((x[edges[:,0]],x[edges[:,1]],x[edges[:,0]]+np.nan)).T.flatten()

lines2d = plt.plot(xs,ys,marker='o')

现在为了更新坐标(例如,将 x 轴移动 .1,将 y 轴移动 .2,您可以这样做:

oldx,oldy=lines2d[0].get_data()
lines2d[0].set_data(oldx+.1,oldy+.2)
plt.draw()

PS 我不完全确定我在 xs,ys 数组中插入 Nans 的方式是最快的,但这可能并不重要。

关于python - 由边连接的点的动画图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9416070/

相关文章:

python - 快速设置像素

python - 从 msrestazure.azure_active_directory 导入(ModuleNotFoundError : No module named 'msrestazure'

eclipse - 编写不使用循环索引的 for 循环的 Pythonic 方法

python - 显示/隐藏情节的图例

python - 在 matplotlib 子图中显示具有实际大小的不同图像

python - Matplotlib:在远程机器上显示绘图

python - Matplotlib 未绘制整条线

python - 在 Bokeh 1.4.0 中使用 box_select 工具“隐藏”而不是 'mute' 字形

python - 在 Tensorflow C++ API 中为占位符张量提供一个值

python - "alembic current"和 "alembic history"搜索不同的路径吗?