2016-11-23 6 views
2

Normalerweise die Karte neu zu zeichnen, wenn Sie eine Grundkarte zu erstellen, können Sie es zu einer Achsen-Instanz zuordnen, zum BeispielIst es möglich, basemap auf vielen Nebenhandlungen zu ziehen, ohne viele Male

fig = plt.figure() 
ax = fig.add_subplot() 
m = Basemap(..., ax=ax) 

Wenn ich jetzt machen wollen , sagen, 30 Nebenhandlungen, ich brauche so etwas wie

fig, axes = plt.subplots(6,5) 
for ax in axes: 
    m = Basemap(..., ax=ax) 
    # plot some other things 

Aber Nachziehen der basemap dauert eine lange Zeit zu tun. Ich habe mich gefragt, ob es möglich ist, die Grundkarteninstanz einmal zu erstellen und dann allen meinen Achsen zuzuordnen. Etwas wie:

m0 = Basemap(...) # without ax = ax 
for ax in axes: 
    m = add_basemap(ax,m0) 
    # plot some other things 

Ist das möglich?

Als Alternative habe ich darüber nachgedacht, die Figur einmal mit allen Grundkarten zu erstellen und dann zu beizen, aber die Anzahl der Nebenplots ist nicht immer gleich.

+0

Wenn Sie eine Instanz erstellen, haben Sie auf allen Karten dieselben Daten. – furas

+0

hmm das ist nicht was ich brauche; Die Karten werden gleich sein, aber die Daten werden anders sein. Ist es möglich, die Grundkarte zu duplizieren, anstatt sie neu zu zeichnen? – Peter9192

+0

wie für mich muss jede Grundkarte von selbst neu zeichnen. Ich glaube nicht, dass es Bitmap erstellen und dann Bitmap anstelle von Neuzeichnen verwenden kann. – furas

Antwort

0

Wenn Sie theoretisch auf Basemap plotten, können Sie alle Objekte löschen (oder unsichtbar machen) und die Karte wiederverwenden.

Jedoch machte ich zwei fuctions - eine Karte zu generieren und andere Daten zu zeichnen:

def genMap(): 
    bMap = Basemap(llcrnrlat=5, urcrnrlat=50, llcrnrlon=10, urcrnrlon=210, \ 
    rsphere=(6378137.00,6356752.3142),resolution='i',projection='lcc',lat_1=30.,lat_2=60.,lat_0=48.,lon_0=135.) 
    return bMap 

def plot(cur_hour, leg, outdir, bMap, lon, lat): 
    fig = plt.figure(figsize=(17, 17), dpi=70, facecolor='w', edgecolor='k') 
    bMap.drawcountries(linewidth=1.5, color='purple') 
    bMap.fillcontinents(color='#FFFCC4', zorder = 0) 
    bMap.drawcoastlines(linewidth=0.75) 
    bMap.drawparallels(np.arange(-90., 120., 10.), labels=[1,0,0,0], color="k", fontsize=LEGEND_SIZE, linewidth=1, labelstyle='+/-') 
    bMap.drawmeridians(np.arange(0., 420., 10.), labels=[0,0,0,1], color="k", fontsize=LEGEND_SIZE, linewidth=1, labelstyle='+/-') 

    CF2 = plt.contourf(lon[::2,::2], lat[::2,::2], fl[::2,::2]) 

Im Haupt nenne ich genMap einmal und das Ergebnis als Argument meine Zeichenfunktionen verwenden:

... 
bMap = generateMap() 
lon,lat = bMap(lon,lat) 
t = threading.Thread(target=plot(cur_hour, leg, OUTDIR, bMap, lon, lat)) 
t.start() 
... 
t.join() 
... 

Dieser Code funktioniert sehr schnell, aber ich vermisse etwas in Understating der Grundkarte Klasse.

0

Es ist tatsächlich möglich, dies zu tun:

fig, axes = plt.subplots(6,5) 
flat_axes = axes.reshape(-1) 
m = Basemap(...) # without ax = ax 
for ax in flat_axes: 
    m.ax = ax 
    # plot some other things 

Hinweis, dass Abflachung Achsen Gitter benötigt wird, um Iteration einfach. Dennoch muss die Basismap-Objektinstanz nach dem "Plotten einiger anderer Dinge" irgendwie zurückgesetzt werden.

Verwandte Themen