0

我需要在matplotlib中画一批散点图,发现matplotlib的速度很慢,然后我lineprofile函数,发现热点是fig, ax = plt.subplots(),创建一个空白图形和轴需要56.1%的时间!!

如何加快速度?我的意思是,我怎样才能重用 fig 和 ax 以避免每次都创建它们?

在此处附上个人资料报告(为了简单起见,我剪掉了一些线)

Total time: 0.733771 s

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   517                                           @profile
   518                                           def df_scatter(df):
   519                                               ''' draw the scatter plot for Pandas dataframe 'df'
   533                                               '''                   
   536                                           
   537         1           75     75.0      0.0      biggest_area = 1000
   538         1          117    117.0      0.0      mycm =  matplotlib.cm.get_cmap('jet') # 'spectral'
   539                                           
   541         1           78     78.0      0.0      col_qty = len(df.columns)
   543                                           
   544         1         1859   1859.0      0.1      x = list(df.ix[:,0].values)
   545         1         1258   1258.0      0.0      y = list(df.ix[:,1].values)                                      
   551                                               
   552         1      1472345 1472345.0     56.1     fig, ax = plt.subplots()
   556                                               
   557         1         7007   7007.0      0.3      plt.subplots_adjust(left=0.07, right=0.92, bottom=0.1, top=0.95)
   558         1          179    179.0      0.0      x_margin, y_margin = (max(x)-min(x))/20, (max(y)-min(y))/20
   563                                           
   564         1           71     71.0      0.0      if col_qty > 2:
   565         1         1602   1602.0      0.1          r = list(df.ix[:,2].values)
   566         1          309    309.0      0.0          size_r = np.array(biggest_area)*r/max(r)
   585                                           
   586         1        34712  34712.0      1.3          sc = plt.scatter(x, y, marker='o', s=size_r, cmap=mycm, alpha=0.65)
   587                                           
   588                                                   # adding colorbar
   589         1       542417 542417.0     20.7          cbaxes = fig.add_axes([0.94, 0.25, 0.02, 0.70])
   590         1       165719 165719.0      6.3          cbar = plt.colorbar(sc, cax=cbaxes)
   591         1          122    122.0      0.0          cbar.solids.set_edgecolor('face')
   595                                           
   602         1         1061   1061.0      0.0          plt.figtext(0.94,0.10,"%0.1f"%(max(r)), fontproperties=TEXT_FONT_MEDIUM)
   639         1           66     66.0      0.0      return fig
4

1 回答 1

-1

我认为最好的方法是打电话

fig = plt.figure() 
ax=fig.add_subplot(111) 

从 df_scatter 之外。然后,将其作为参数传递给 df_scatter:

df_scatter(df,fig,ax):

或者干脆在df_scatter里面做:

def df_scatter(df):
    fig = plt.gcf()
    ax = plt.gca()

无花果和轴的创建完成后。

于 2013-07-04T13:55:03.583 回答