Python 如何在打印和保存大量图形时加速matplotlib?
我正在处理来自许多天线基线的观测数据。目前我正在绘制约40个图形,每个图形都有4x5子地块区域。我发现在循环中使用matplotlib绘制和保存图形时速度很慢。这是我的密码:Python 如何在打印和保存大量图形时加速matplotlib?,python,matplotlib,Python,Matplotlib,我正在处理来自许多天线基线的观测数据。目前我正在绘制约40个图形,每个图形都有4x5子地块区域。我发现在循环中使用matplotlib绘制和保存图形时速度很慢。这是我的密码: import numpy as np import matplotlib.pyplot as plt import time ... PLT_PAGE_NUM = 39 # default is 39 SUB_PLT_NUM = 20 # default is 20
import numpy as np
import matplotlib.pyplot as plt
import time
...
PLT_PAGE_NUM = 39 # default is 39
SUB_PLT_NUM = 20 # default is 20
for pp in xrange(0,PLT_PAGE_NUM):
plt.figure(figsize=(20,12))
start_time = time.clock()
for kk in xrange(0,SUB_PLT_NUM):
plt.subplot(5,4,kk+1)
plt.plot(np.arange(0,TIME_LENGTH), xcor_real_arr[20*pp+kk,0:],'r-',
range(0,TIME_LENGTH), xcor_imag_arr[20*pp+kk,0:],'b-')
plt.title('XCOR of '+ ind_arr[20*pp+kk], color='k')
plt.savefig('test_imag_real'+str(pp)+'.png',format='png',dpi=100)
print 'Fig-'+str(pp)+' has been saved'
print "Excution time:", time.clock()-start_time
执行时间信息为:
######### Check your inputs setting #########
You have selected 2 files.
The time interval is From 2011-10-20_14:28:38 to 2011-10-20_15:10:54
Your time resolution is set to 1.125s
The total plot points number is: 100
Your frequency channel is: ch2
######### Hardworking...please wait #########
Fig-0 has been saved
Excution time: *2.52576639619*
Fig-1 has been saved
Excution time: *2.59867230708*
Fig-2 has been saved
Excution time: *2.81915188482*
Fig-3 has been saved
Excution time: *2.83102198991*
Program ends
正如你们所看到的,我只画了4个数字,花费了大约11秒。绘制和保存所有39个数字需要约2分钟。我不知道瓶颈在哪里。你能帮我快点吗?
谢谢我已修改了您的代码,使其可运行:
import numpy as np
import matplotlib.pyplot as plt
import time
PLT_PAGE_NUM = 39 # default is 39
SUB_PLT_NUM = 20 # default is 20
TIME_LENGTH = 1000
xcor_real_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH))
xcor_imag_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH))
for pp in xrange(0,PLT_PAGE_NUM):
plt.figure(figsize=(20,12))
start_time = time.time()
for kk in xrange(0,SUB_PLT_NUM):
plt.subplot(5,4,kk+1)
plt.plot(np.arange(0,TIME_LENGTH), xcor_real_arr[SUB_PLT_NUM*pp+kk,0:],'r-',
range(0,TIME_LENGTH), xcor_imag_arr[SUB_PLT_NUM*pp+kk,0:],'b-')
plt.title('XCOR of '+ str(SUB_PLT_NUM*pp+kk), color='k')
plt.savefig('test_imag_real'+str(pp)+'.png',format='png',dpi=100)
print 'Fig-'+str(pp)+' has been saved'
print "Excution time:", time.time()-start_time
在我的机器上,每个数字大约需要3秒钟:
Fig-0 has been saved
Excution time: 3.01798415184
Fig-1 has been saved
Excution time: 3.08960294724
Fig-2 has been saved
Excution time: 2.9629740715
使用来自的想法(Joe Kington也演示了这一点),我们可以通过重用相同的轴并简单地重新定义每个图的y数据,将速度提高约33%(每个图1秒):
import numpy as np
import matplotlib.pyplot as plt
import time
PLT_PAGE_NUM = 39 # default is 39
SUB_PLT_NUM = 20 # default is 20
TIME_LENGTH = 1000
xcor_real_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH))
xcor_imag_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH))
plt.figure(figsize=(20,12))
ax = {}
line1 = {}
line2 = {}
for pp in xrange(0,PLT_PAGE_NUM):
start_time = time.time()
for kk in xrange(0,SUB_PLT_NUM):
if pp == 0:
ax[kk] = plt.subplot(5,4,kk+1)
line1[kk], line2[kk] = ax[kk].plot(np.arange(0,TIME_LENGTH),
xcor_real_arr[SUB_PLT_NUM*pp+kk,0:],'r-',
range(0,TIME_LENGTH),
xcor_imag_arr[SUB_PLT_NUM*pp+kk,0:],'b-')
else:
line1[kk].set_ydata(xcor_real_arr[SUB_PLT_NUM*pp+kk,0:])
line2[kk].set_ydata(xcor_imag_arr[SUB_PLT_NUM*pp+kk,0:])
plt.title('XCOR of '+ str(SUB_PLT_NUM*pp+kk), color='k')
plt.savefig('test_imag_real'+str(pp)+'.png',format='png',dpi=100)
print 'Fig-'+str(pp)+' has been saved'
print "Excution time:", time.time()-start_time
这将产生以下执行时间:
Fig-0 has been saved
Excution time: 3.0408449173
Fig-1 has been saved
Excution time: 2.05084013939
Fig-2 has been saved
Excution time: 2.01951694489
(第一个图形仍然需要3秒钟来设置初始绘图。在后续的图形中,我们可以节省一些时间。)unutbu,我尝试运行了您的代码。令人惊讶的是,我的笔记本电脑上的总执行时间缩短到了68.5159994秒。帮了我大忙,谢谢。重复使用(或“冻结”)相同的轴是一个很好的提示!