优化matplotlib pyplot:绘制许多小块图

时间:2012-01-10 02:57:44

标签: python optimization plot matplotlib

我想制作一些电影,其中有一些标绘点可以移动进行基本的交通模拟。绘图需要永远,但是~~ 10帧需要7s !!怎么了?

Python代码:

import numpy as np
import matplotlib.pyplot as plt
import cProfile

def slowww_plot():
    for i in range(10):
        plt.plot(0, 0, 'bo')
        plt.savefig('%03i.png' % i)
        plt.clf()
        plt.plot(0, 0, 'ro')   
        plt.savefig('%03i.png' % (i+1))
        plt.clf()

cProfile.run('slowww_plot()', sort = 'cumulative'

产生

In [35]: %run test.py
         2035814 function calls (2011194 primitive calls) in 7.322 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    7.322    7.322 <string>:1(<module>)
        1    0.000    0.000    7.322    7.322 test.py:5(slowww_plot)
       40    0.006    0.000    3.615    0.090 axes.py:821(cla)
1440/1120    0.044    0.000    3.278    0.003 axis.py:62(__init__)
       20    0.000    0.000    3.049    0.152 pyplot.py:468(savefig)
       20    0.000    0.000    3.049    0.152 figure.py:1077(savefig)
       20    0.001    0.000    3.048    0.152 backend_bases.py:1892(print_figure)
  520/360    0.015    0.000    2.523    0.007 axis.py:697(cla)
       20    0.010    0.001    2.506    0.125 backend_bases.py:1791(print_png)
       20    0.003    0.000    2.495    0.125 backend_agg.py:444(print_png)
  520/360    0.006    0.000    2.475    0.007 axis.py:732(reset_ticks)
     4340    0.172    0.000    2.373    0.001 lines.py:128(__init__)
       20    0.000    0.000    2.198    0.110 pyplot.py:2449(plot)
       20    0.000    0.000    2.149    0.107 pyplot.py:683(gca)
       20    0.000    0.000    2.149    0.107 figure.py:1030(gca)
       20    0.001    0.000    2.149    0.107 figure.py:710(add_subplot)
       20    0.000    0.000    2.146    0.107 axes.py:8327(__init__)
       20    0.002    0.000    2.139    0.107 axes.py:359(__init__)
       20    0.000    0.000    2.075    0.104 pyplot.py:439(clf)
       20    0.001    0.000    2.074    0.104 figure.py:782(clf)
    20240    0.189    0.000    1.941    0.000 markers.py:114(_recache)
  720/560    0.003    0.000    1.720    0.003 axis.py:1803(_get_tick)
       80    0.002    0.000    1.600    0.020 axis.py:830(set_clip_path)
      160    0.000    0.000    1.592    0.010 spines.py:153(cla)
  720/560    0.003    0.000    1.564    0.003 axis.py:1543(_get_tick)
      120    0.004    0.000    1.278    0.011 axis.py:1183(get_major_ticks)
       20    1.267    0.063    1.267    0.063 {built-in method write_png}
       20    0.000    0.000    1.224    0.061 backend_agg.py:394(draw)
  1520/20    0.013    0.000    1.200    0.060 artist.py:53(draw_wrapper)
       20    0.002    0.000    1.199    0.060 figure.py:815(draw)
       20    0.002    0.000    1.175    0.059 axes.py:1866(draw)
       40    0.002    0.000    1.100    0.028 axis.py:1029(draw)
    10120    0.017    0.000    1.078    0.000 markers.py:132(set_fillstyle)
     5780    0.013    0.000    1.032    0.000 markers.py:109(__init__)

如何优化此功能?我已经尝试使用PdfPages后端并从状态包装器切换到仅使用Axis.plot,但一切都仍然很慢。

2 个答案:

答案 0 :(得分:10)

如果你想要动画,你的效率非常低。

不是每次都制作新的数字,只需设置新数据并重绘现有数字。

例如:

import matplotlib.pyplot as plt
import numpy as np

xy = 100 * np.random.random((2,10))
x, y = xy

fig, ax = plt.subplots()
points, = ax.plot(x, y, 'bo')

for i in range(10):
    xy += np.random.random(xy.shape) - 0.5
    points.set_data(xy)
    fig.savefig('%03i.png' % i)

答案 1 :(得分:2)

您可能对matplotlib(1.1.0)new animation feature感兴趣。以下是他们网站上的一个示例,展示了如何制作简单的动画:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def update_line(num, data, line):
    line.set_data(data[...,:num])
    return line,

fig1 = plt.figure()
data = np.random.rand(2, 25)
l, = plt.plot([], [], 'r-')
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.xlabel('x')
plt.title('test')
line_ani = animation.FuncAnimation(fig1, update_line, 25, fargs=(data, l),
    interval=50, blit=True)
line_ani.save('lines.mp4')