2012-05-08 6 views
4

私はMatplotlibBasemapを使って、経済データの地理空間視覚化のためのツールを作成しています。BasemapとMatplotlib - 速度の改善

しかし、私が考えた唯一のやり方は、データを変更するたびに新しいベースマップを作成することです。ここで

は、私が使用しているコードの関連部分です:

class WorldMapCanvas(FigureCanvas): 

def __init__(self,data,country_data): 
    self.text_objects = {} 
    self.figure = Figure() 
    self.canvas = FigureCanvas(self.figure) 
    self.axes = self.figure.add_subplot(111) 
    self.data = data 
    self.country_data = country_data 
    #this draws the graph 
    super(WorldMapCanvas, self).__init__(Figure()) 
    self.map = Basemap(projection='robin',lon_0=0,resolution='c', ax=self.axes) 
    self.country_info = self.map.readshapefile(
     'shapefiles/world_country_admin_boundary_shapefile_with_fips_codes', 'world', drawbounds=True,linewidth=.3) 

    self.map.drawmapboundary(fill_color = '#85A6D9') 
    self.map.fillcontinents(color='white',lake_color='#85A6D9') 
    self.map.drawcoastlines(color='#6D5F47', linewidth=.3) 
    self.map.drawcountries(color='#6D5F47', linewidth=.3) 
    self.countrynames = [] 
    for shapedict in self.map.world_info: 
     self.countrynames.append(shapedict['CNTRY_NAME']) 

    min_key = min(data, key=data.get) 
    max_key = max(data, key=data.get) 
    minv = data[min_key] 
    maxv = data[max_key] 

    for key in self.data.keys(): 
     self.ColorCountry(key,self.GetCountryColor(data[key],minv,maxv)) 
    self.canvas.draw() 

はどうすれば速くこれらのプロットを作成することができますか?

コードを実行するたびにマップを作成しないようにするソリューションは考えられませんでした。私はクラスの外でキャンバス/フィギュアを作成しようとしましたが、それはそれほど大きな違いはありませんでした。最も遅い呼び出しは、ベースマップを作成し、形状データをロードするものです。他のすべてはかなり速く走ります。

また、私は将来の使用のためにベースマップを保存しようとしましたが、新しい軸が必要なので、動作させることができませんでした。たぶんあなたはこれを行う方法について正しい方向に私を指すことができます。

私はPySide QWidgetとしてキャンバスを使用していますが、私はデータによって異なる種類のマップをプロットしていることを知りたいのですが、これはちょうどそのうちの1つです(もう1つはヨーロッパ、または米国)を指します。

+0

どのバージョンのmatplotlibを使用していますか?パフォーマンスの指標を与えるために、v1.0で45分からv1.1で約3分になるコードが1つありました(正しく覚えていれば、ベースマップのバージョンは変更されませんでした)。 – pelson

答えて

4

Basemapインスタンス(there is an example of doing this in the basemap source)をpickleおよびunpickleすると、プロットの作成にかなりの時間を節約できます。

さらに、シェイプファイルの読み込みがどれくらい時間がかかるかを知る価値があるでしょう(あなたもピクルしたいかもしれません)。

最後に、毎回新しい人物を作るのではなく、データの国の色を更新するオプションを検討することを真剣に検討します。

HTH、

+0

リンク先のピクルスマップファイルをどのように生成するのかと思いました。 – theJollySin

+1

関連する行はhttps://github.com/matplotlib/basemap/blob/master/examples/hires.py#L21 – pelson

+0

です。これは非常に古い投稿ですが、これを尋ねるのに抵抗することはできません。 Pelson、シェイプファイルをピクルし、必要なときにいつも再びロードしますか?私はこの点についてどのような例もつくことができませんでした。 –

関連する問題