私はMatplotlib
とBasemap
を使って、経済データの地理空間視覚化のためのツールを作成しています。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つはヨーロッパ、または米国)を指します。
どのバージョンのmatplotlibを使用していますか?パフォーマンスの指標を与えるために、v1.0で45分からv1.1で約3分になるコードが1つありました(正しく覚えていれば、ベースマップのバージョンは変更されませんでした)。 – pelson