我想要做的是让脚本计算一些东西,准备一个绘图并将已经获得的结果显示为pylab.figure - 在python 2(特别是python 2.7)中使用稳定的matplotlib(1.1.1).
在python 3(带有matplotlib git build ...版本1.2.x的python 3.2.3)中,这很好用.作为一个简单的例子(通过time.sleep()模拟冗长的计算)考虑
import pylab
import time
import random
dat=[0,1]
pylab.plot(dat)
pylab.ion()
pylab.draw()
for i in range (18):
dat.append(random.uniform(0,1))
pylab.plot(dat)
pylab.draw()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
在python 2(版本2.7.3 vith matplotlib 1.1.1)中,代码运行干净而没有错误,但没有显示图.使用python2解释器进行一些试验和错误似乎建议用pylab.show()替换pylab.draw(); 这样做一次显然是足够的(不是,就像在绘图中每次更改/添加之后调用它一样).因此:
import pylab
import time
import random
dat=[0,1]
pylab.plot(dat)
pylab.ion()
pylab.show()
for i in range (18):
dat.append(random.uniform(0,1))
pylab.plot(dat)
#pylab.draw()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
但是,这也不起作用.它再次运行干净,但没有显示数字.它似乎只在等待用户输入时这样做.我不清楚为什么会这样,但是当将raw_input()添加到循环中时,最终会显示该图
import pylab
import time
import random
dat=[0,1]
pylab.plot(dat)
pylab.ion()
pylab.show()
for i in range (18):
dat.append(random.uniform(0,1))
pylab.plot(dat)
#pylab.draw()
time.sleep(1)
raw_input()
Run Code Online (Sandbox Code Playgroud)
有了这个,脚本当然会在显示情节时等待用户输入,并且在用户点击进入之前不会继续计算数据.当然,这不是意图.
这可能是由不同版本的matplotlib(1.1.1和1.2.x)或不同的python版本(2.7.3和3.2.3)引起的.
有没有办法用python 2和一个稳定的(1.1.1)matplotlib完成上面的脚本(第一个)在python …
我想在matplotlib中绘制一系列.png图像.目标是快速绘制它们以模拟电影的效果,但我有其他理由想要避免实际创建.avi文件或保存matplotlib图形,然后在Python之外按顺序查看它们.
我特意尝试在Python中的for循环中按顺序查看图像文件.假设我已正确导入matplotlib,并且我有自己的函数'new_image()'和'new_rect()',这里有一些示例代码无法工作,因为show()函数调用GUI mainloop的阻塞效果:
for index in index_list:
img = new_image(index)
rect = new_rect(index)
plt.imshow(img)
plt.gca().add_patch(rect)
plt.show()
#I also tried pausing briefly and then closing, but this doesn't
#get executed due to the GUI mainloop from show()
time.sleep(0.25)
plt.close()
Run Code Online (Sandbox Code Playgroud)
上面的代码只能显示第一个图像,但程序只是挂起并等待我手动关闭结果图窗口.一旦我关闭它,程序就会挂起并且不会重新绘制新的图像数据.我该怎么办?另请注意,我已尝试使用plt.draw()命令替换plt.show()命令,然后在for循环外添加plt.show().这不会显示任何内容而只是挂起.
我想为网络图制作动画以显示算法的进度。我正在使用 NetworkX 进行图形创建。
从这个 SO answer,我想出了一个使用clear_ouputfromIPython.display和命令plt.pause()来管理动画速度的解决方案。这适用于具有几个节点的小图形,但是当我在 10x10 网格上实现时,动画非常慢,减少参数plt.pause()似乎对动画速度没有任何影响。这是一个带有 Dijkstra 算法实现的 MME,我在算法的每次迭代中更新节点的颜色:
import math
import queue
import random
import networkx as nx
import matplotlib.pyplot as plt
from IPython.display import clear_output
%matplotlib inline
# plotting function
def get_fig(G,current,pred):
nColorList = []
for i in G.nodes():
if i == current: nColorList.append('red')
elif i==pred: nColorList.append('white')
elif i==N: nColorList.append('grey')
elif node_visited[i]==1:nColorList.append('dodgerblue')
else: nColorList.append('powderblue')
plt.figure(figsize=(10,10))
nx.draw_networkx(G,pos,node_color=nColorList,width=2,node_size=400,font_size=10)
plt.axis('off')
plt.show()
# graph creation
G=nx.DiGraph()
pos={}
cost={}
for i …Run Code Online (Sandbox Code Playgroud) 我有一个代表网络拓扑结构的关键节点是颜色的networkx春天布局为红色,其余是蓝色边缘与虚线表示的关键节点的路由我怎么可以在指定的时间间隔动画绘制networkx边缘?
#!/usr/bin/env python
import matplotlib.pyplot as plt
import networkx as nx
import matplotlib as mpl
G=nx.Graph()
G.add_edge('a','b',weight=0.6)
G.add_edge('a','c',weight=0.2)
G.add_edge('c','d',weight=0.1)
G.add_edge('c','e',weight=0.7)
G.add_edge('c','f',weight=0.9)
G.add_edge('a','d',weight=0.3)
elarge=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] >0.5]
esmall=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] <=0.5]
#specify an initial position that is not random e.g. use a circular layout
pos=nx.circular_layout(G)
pos=nx.spring_layout(G,dim=2,pos=pos) # positions for all nodes
#pos=nx.spring_layout(G) # positions for all nodes
print "Graph xy positions"
print pos
# nodes
nx.draw_networkx_nodes(G,pos,node_size=700)
# edges
nx.draw_networkx_edges(G,pos,edgelist=elarge,
width=6)
nx.draw_networkx_edges(G,pos,edgelist=esmall,
width=6,alpha=0.5,edge_color='b',style='dashed')
# …Run Code Online (Sandbox Code Playgroud)