我正在尝试使用带有插入缩放的底图制作绘图。我在使用mark_inset()的插入框时遇到问题,出现在左下角的任何地方。它适用于projection ='cyl'但不适用于projection ='geos'这就是我想要的。
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 :(得分:0)
碰到这个......可以证实这是一个问题。
我还没有尝试过每一次投射,但是我尝试了十几次投影,而且还没有尝试过。是唯一一个mark_inset工作的地方。所有其他人都在左下方找到它。
答案 1 :(得分:0)
我遇到了同样的问题。这是因为Basemap在内部使用投影坐标 - 除cyl
投影外;阅读here:
使用参数lon调用Basemap类实例,lat将lon / lat(以度为单位)转换为x / y地图投影坐标(以米为单位)。 [...]
对于圆柱等距投影(cyl),这没有任何作用(即x,y == lon,lat)。
要使标记正常工作,您需要首先提取插入地图限制,将它们转换为地理坐标,然后再将它们重新投影到主地图上。
我为mark_inset
编写了一个小替换函数,它还需要Basemap对象m
&两个地图(主要和插入)m2
:
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
对象不一定是 inset 对象 - 它可以是任何轴对象(例如,也是子图)。因此,该函数的更好名称是mark_geo_zoom
。 ;-)