我正在使用matplotlib创建一个包含许多小子图的图形(类似于4行8列)。我尝试了几种不同的方法,而使matplotlib制作轴的最快速度是约2秒。我看到了this post,其中提到只使用一个轴对象来显示许多小图像,但我想在轴上能够有刻度和标题。是否有任何方法可以加速这个过程,或者在matplotlib中制作轴只需要相当长的时间?
这是我迄今为止尝试过的:
这是我迄今为止尝试过的:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import time
fig = plt.figure(figsize=(10,6))
plt.clf(); t = time.time()
grid = ImageGrid(fig, 111,
nrows_ncols = (4, 8))
print 'Time using ImageGrid: %.2f seconds'%(time.time()-t)
plt.clf(); t = time.time()
axes = plt.subplots(4,8)
print 'Time using plt.subplots: %.2f seconds'%(time.time()-t)
plt.clf(); t = time.time()
axes = []
for row in range(0,4):
for col in range(1,9):
ax = plt.subplot(4,8,row*8+col)
axes.append(ax)
print 'Time using ptl.subplot loop: %.2f seconds'%(time.time()-t)
输出:
Time using ImageGrid: 4.25 seconds
Time using plt.subplots: 2.11 seconds
Time using ptl.subplot loop: 2.34 seconds
采用Joe Kington的建议,我试图将图形和轴pickle起来,这样每次运行脚本时就不需要重新创建它们。然而,加载文件实际上需要更长时间:
import matplotlib.pyplot as plt
import pickle
import time
t = time.time()
fig,axes = plt.subplots(4,8,figsize=(10,6))
print 'Time using plt.subplots: %.2f seconds'%(time.time()-t)
pickle.dump((fig,axes),open('fig.p','wb'))
t = time.time()
fig,axes = pickle.load(open('fig.p','rb'))
print 'Time to load pickled figure: %.2f seconds'%(time.time()-t)
输出:
Time using plt.subplots: 2.01 seconds
Time to load pickled figure: 3.09 seconds
pickle.dump(objects, file, pickle.HIGHEST_PROTOCOL)
)和b)如果您使用的是Python 2.x,则使用cPickle
而不是Pickle
。(只需使用import cPickle as pickle
而不是import pickle
。)在我的机器上,Pickling大约快3倍,但这将严重取决于I/O速度等因素,因此在您的系统上可能会更快或更慢。 - Joe Kington