Таким образом, я представляю кольцевую сеть с маркерным доступом (выполнение моделирования в SimPy), я полностью новичок к matplotlib, но мне сказали, что это будет действительно хорошо для представления моего моделирования визуально.
Таким образом, я погуглил вокруг и узнал, как потянуть формы и строки - использующий add_patch и add_line соответственно к осям (я верю). Таким образом, теперь у меня есть этот вывод, который прекрасен абсолютно:
(еще не может отправить изображения!!) http://img137.imageshack.us/img137/7822/screenshot20100121at120.png
Но я получаю это использование pylab.show () функция, и что я думаю, что хочу, должен достигнуть этого использования pylab.plot () функция так, чтобы я мог затем обновить его как свои успехи моделирования с помощью pylab.draw () позже.
Мой код следующие:
plab.ion()
plab.axes()
for circ in self.circleList:
plab.gca().add_patch(circ)
for line in self.lineList:
plab.gca().add_line(line)
plab.axis('scaled')
plab.show()
Где circleList и lineList являются списками, содержащими круги и строки на схеме
Я, вероятно, неправильно понимаю что-то простое здесь, но я не могу на самом деле найти примеры, которые не являются открыто графиком, основывал то использование график () функция.
Разъяснение:
Как я могу получить тот же самый вывод, с помощью pylab.plot () вместо pylab.show ()?
Реплицирование вашего изображения с использованием метода участка:
from pylab import *
points = []
points.append((-0.25, -1.0))
points.append((0.7, -0.7))
points.append((1,0))
points.append((0.7,1))
points.append((-0.25,1.2))
points.append((-1,0.5))
points.append((-1,-0.5))
points.append((-0.25, -1.0))
a_line = plot(*zip(*points))[0]
a_line.set_color('g')
a_line.set_marker('o')
a_line.set_markerfacecolor('b')
a_line.set_markersize(30)
axis([-1.5,1.5,-1.5,1.5])
show()
Редактировать на основе комментариев
Это использует библиотеку многопроцессора Python для запуска анимации MATPLOTLIB в отдельном процессе. Основной процесс использует очередь для передачи данных к ней, которые затем обновляют изображение графика.
# general imports
import random, time
from multiprocessing import Process, Queue
# for matplotlib
import random
import numpy as np
import matplotlib
matplotlib.use('GTKAgg') # do this before importing pylab
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
def matplotLibAnimate(q,points):
# set up initial plot
fig = plt.figure()
ax = fig.add_subplot(111)
circles = []
for point in points:
ax.add_patch(Circle(point,0.1))
a_line, = ax.plot(*zip(*points))
a_line.set_color('g')
a_line.set_lw(2)
currentNode = None
def animate(currentNode = currentNode):
while 1:
newNode = q.get()
if currentNode: currentNode.remove()
circle = Circle(newNode,0.1)
currentNode = ax.add_patch(circle)
circle.set_fc('r')
fig.canvas.draw()
# start the animation
import gobject
gobject.idle_add(animate)
plt.show()
#initial points
points = ((-0.25, -1.0),(0.7, -0.7),(1,0),(0.7,1),(-0.25,1.2),(-1,0.5),(-1,-0.5),(-0.25, -1.0))
q = Queue()
p = Process(target = matplotLibAnimate, args=(q,points,))
p.start()
# feed animation data
while 1:
time.sleep(random.randrange(4))
q.put(random.sample(points,1)[0])
Конечно, после этого я думаю, что вам лучше служить с помощью решения Whatnick. Я бы создал свой собственный графический интерфейс, а не использовать встроенный виджет MATPLOTLIB. Затем я бы «оживил» мой графический интерфейс, создавая PNGS и обменивая их.
Основная техника заключается в том, чтобы обновить данные элементов, отображаемых с помощью Set_data. Затем вызовите нарисовать (). Посмотрите, есть ли элементы вашего круга и линейных элементов SET_DATA. В противном случае вы можете использовать PYVTK . Другой вариант состоит в том, чтобы рендер и сохранить участки для файлов PNG, а затем построить анимацию от тех.