2017-01-12 1 views
1

Ich versuche ein Plot mit Grundkarte mit einem Inset-Zoom zu erstellen. Ich habe Probleme mit der Insetbox von mark_inset(), um irgendwo neben der unteren linken Ecke zu erscheinen. Es funktioniert für die Projektion = 'Zyl', aber nicht für die Projektion = 'Geos' was ich will.Grundkarte, projektion = 'geos', kontrolliere mark_inset() location

from mpl_toolkits.basemap import Basemap 
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes 
from mpl_toolkits.axes_grid1.inset_locator import mark_inset 
import matplotlib.pyplot as plt 

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

map1 = Basemap(projection='geos', lat_0=0, lon_0=0) 
map1.drawmapboundary() 
map1.drawcoastlines() 

axins = zoomed_inset_axes(ax, 7, loc=3) 
axins.set_xlim(-12, 5) 
axins.set_ylim(50, 60) 

map2 = Basemap(projection='geos', lon_0=0, llcrnrlon=-12, llcrnrlat=50, urcrnrlon=5, urcrnrlat=60[enter image description here][1]) 
map2.drawcoastlines() 

mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5") 

Antwort

0

Stoßen das ... kann bestätigen, dass es ein Problem ist.

Ich habe jede Projektion nicht versucht, aber von dem Dutzend ich versucht habe, ‚CYL‘ ist die einzige, in dem mark_inset funktioniert. Alle anderen finden es unten links.

0

Ich stieß auf das gleiche Problem. Dies liegt daran, dass Grundkarte intern mit projizierten Koordinaten arbeitet - mit Ausnahme der Projektion cyl; Lesen here:

eine Grundkarte Klasseninstanz mit den Argumenten lon Aufruf wird lat lon/LAT (in Grad) konvertieren, x/y Koordinaten Kartenprojektion (in Metern). [

Für zylindrische äquidistante Projektion (Zyl) tut dies nichts (d. H. X, y == lon, lat). die Nebenkarte Grenzen zuerst zu extrahieren, wandeln sie in geographischen Koordinaten, und schließlich wieder Projekt sie wieder auf die Hauptkarte

Um die Markierung richtig funktioniert, die Sie benötigen.

schrieb ich eine kleine Ersatzfunktion für mark_inset, dass die Basemap Objekte zusätzlich benötigt m & m2 beiden Karten (Haupt- und Nebenbild):

def mark_inset(ax, ax2, m, m2, loc1=(1, 2), loc2=(3, 4), **kwargs): 
    """ 
    Patched mark_inset to work with Basemap. 
    Reason: Basemap converts Geographic (lon/lat) to Map Projection (x/y) coordinates 

    Additionally: set connector locations separately for both axes: 
     loc1 & loc2: tuple defining start and end-locations of connector 1 & 2 
    """ 

    # Doesn't work for Basemap 
# rect = TransformedBbox(inset_axes.viewLim, parent_axes.transData) 

# axzoom_geoLims = np.array(m2(*ax2.viewLim._points.T, inverse=True)) 
    axzoom_geoLims = m2(ax2.get_xlim(), ax2.get_ylim(), inverse=True) 
    rect = TransformedBbox(Bbox(np.array(m(*axzoom_geoLims)).T), ax.transData) 

    pp = BboxPatch(rect, fill=False, **kwargs) 
    ax.add_patch(pp) 

    p1 = BboxConnector(ax2.bbox, rect, loc1=loc1[0], loc2=loc1[1], **kwargs) 
    ax2.add_patch(p1) 
    p1.set_clip_on(False) 
    p2 = BboxConnector(ax2.bbox, rect, loc1=loc2[0], loc2=loc2[1], **kwargs) 
    ax2.add_patch(p2) 
    p2.set_clip_on(False) 

    return pp, p1, p2 

Hinweis: die Funktion auf another answer basiert, die unterschiedlich einstellen können Start- und Endpositionen für die Anschlüsse. Daher können Sie das auch mit dieser Funktion tun.

Hinweis 2: das ax2 Objekt muss nicht notwendigerweise ein Inset Objekt sein - es kann eine beliebige Achse Objekt sein (beispielsweise auch ein subplot). Daher wäre ein besserer Name für die Funktion mark_geo_zoom. ;-)

Verwandte Themen