Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用networkx和matplotlib平滑网络动画_Python_Matplotlib_Animation_Networkx - Fatal编程技术网

Python 使用networkx和matplotlib平滑网络动画

Python 使用networkx和matplotlib平滑网络动画,python,matplotlib,animation,networkx,Python,Matplotlib,Animation,Networkx,我正在尝试为网络图形的布局更改设置动画。我的测试代码如下: 导入matplotlib.pyplot作为plt 将matplotlib.animation导入为动画 将networkx导入为nx 随机输入 将numpy作为np导入 图=plt.图() 节点编号=0 G=nx.Graph() G.add_节点(节点编号,位置=np.asarray([random.randrange(0100),random.randrange(0100)]) 尽管如此: 如果节点编号

我正在尝试为
网络
图形的布局更改设置动画。我的测试代码如下:

导入matplotlib.pyplot作为plt
将matplotlib.animation导入为动画
将networkx导入为nx
随机输入
将numpy作为np导入
图=plt.图()
节点编号=0
G=nx.Graph()
G.add_节点(节点编号,位置=np.asarray([random.randrange(0100),random.randrange(0100)])
尽管如此:
如果节点编号<50:
节点号+=1
G.add_节点(节点编号,位置=np.asarray([random.randrange(0100),random.randrange(0100)])
ns=列表(例如节点())
ns.移除(节点编号)
G.添加边(节点号,随机选择(ns))
其他:
打破
source_pos=list(nx.get_node_属性(G,'Position').values())
目标位置=列表(nx.圆形布局(G).values())
def动画(t):
全球源位置
全球目标位置
插值=np.asarray(源位置)*(1-t)+np.asarray(目标位置)*t
plt.clf()
plt.cla()
nx.绘图(G,位置=插值)
ax=plt.gca()
ax.collections[0]。设置颜色(“000000”)
ani=animation.FuncAnimation(图,anim,repeat=False,frames=300,interval=20)
plt.show()
无论我如何调整动画的间隔或帧,代码都会生成奇怪的过渡。我附上上述代码的输出。有人能帮我解决我犯的错误吗


当您在
anim
功能中传递
t
时,您传递一个帧编号,因此您必须将其除以此行中的帧计数:

interpolation=np.asarray(源位置)*(1-t/299)+np.asarray(目标位置)*t/299
(因为
计数是300:0到299)

另外,您可以在节点编号<50:时使用
,并在为True时删除测试部分,而不是

编辑 所以我使用
random.random()
来获得一个介于-1和1之间的随机位置。 动画要好得多

导入matplotlib.pyplot作为plt
将matplotlib.animation导入为动画
将networkx导入为nx
随机输入
将numpy作为np导入
图=plt.图()
G=nx.Graph()
节点编号=0
当节点数量<50时:
G.添加节点(节点编号,
位置=np.asarray([random.random()*2-1,
random.random()*2-1]))
ns=列表(例如节点())
G.添加边(节点号,随机选择(ns))
节点号+=1
s_pos=nx.get_node_属性(G,‘位置’)
t_位置=nx.圆形布局(G)
def动画(t):
全球s_pos
全球旅游局
插值={i:s_pos[i]*(1-t/299)+t_pos[i]*t/299表示范围(50)内的i}
plt.clf()
plt.cla()
nx.绘图(G,位置=插值)
ani=animation.FuncAnimation(图,anim,repeat=False,frames=300,interval=20)
plt.show()

谢谢,@david!情况好多了。我现在唯一的问题是,它从非常小的移动开始,随着
t
上升,移动变得更好。我想知道我怎样才能使它更现实。类似于基于JS的工具。有什么建议吗?我想这是因为
circular\u layout
扩展到了-1和1之间,而且你的源位置要宽得多,所以你有一个取消缩放的效果。太好了!谢谢,大卫。即使在其他几个布局中,速度也在均匀变化。我能够通过将帧数减少到30来加速转换,并通过将间隔设置为1来尝试使其平滑。然而,它仍然远不如基于JS的解决方案平滑。是因为清除了绘图区域并重新绘制,我指的是matplotlib的局限性吗?我还没有找到任何pythonic解决方案来制作网络动画…别忘了,你可以保存为GIF或MP4格式,我想,动画输出会比Tk更流畅。但这是另一个问题。。。顺便说一句,请随意接受答案;-)哦,当然!就这么做了!谢谢你的帮助:-)