2017-01-12 6 views
1

私は、インセットズーム付きのベースマップを使ってプロットを作ろうとしています。私はmark_inset()のインセットボックスに問題があり、左下のコーナー以外の場所に表示されます。それはprojection = 'cyl'では有効ですが、projection = 'geos'ではなく、私が望むものです。basemap、projection = 'geos'、control 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") 

答えて

0

これをバンプすると問題が確認できます。

私はすべてのプロジェクションを試したわけではありませんが、私が試したダースの中で、 'cyl'だけがmark_insetが動作する場所です。他のすべての人はそれを左下に配置します。

0

同じ問題が発生しました。これは、Basemapが投影座標で内部的に動作するためです(cyl投影を除く)。 here読み取る:

引数LONとベースマップクラスのインスタンスを呼び出し、LATは(メートルで)のx/yの地図投影座標(度)、経度/緯度変換します。 [...]

円柱の等距離投影(cyl)の場合、これは何もしません(x、y == lon、lat)。

適切にマーキング作業を行うには、まずメインマップ上にそれらを再度、差し込みマップの制限を抽出地理座標に変換し、最終的に再プロジェクトする必要があります。

私はさらに、ベースマップは m &(主および挿入図)の両方のマップの m2オブジェクト必要 mark_insetための小さな置換機能を書いた:

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 

注:関数はanother answerに基づいて異なるように設定することができコネクタの開始位置と終了位置。したがって、あなたはこの機能でもそうすることができます。

注2:ax2オブジェクトは必ずしもはめ込みオブジェクトである必要はない - それは(また、例えば、サブプロット)任意の軸オブジェクトであり得ます。したがって、関数のより良い名前はmark_geo_zoomになります。 ;-)

関連する問題