python - 为什么我不能在我的 Matplotlib/Cartopy 地图上添加图像?
问题描述
我正在开展一个项目,该项目涉及使用 Cartopy 在地图上绘制数据。
到目前为止一切正常,但我一直在重构代码以使程序的其他部分可以调用不同的函数。所以为此,我有一个函数可以将我的背景添加到地图中,另一个函数可以在指定的纬度/经度处添加一个地标。显然,我想要背景上方的地标,但我似乎无法让它工作。
对于背景,我希望能够使用 Cartopy 库存图像或网络地图图块。无论哪种方式,问题都是相同的,因此我将 Cartopy 背景用于当前测试目的。这是该功能:
def custom_background(self, source_point):
cartmap = self.plot
source_point = source_point.split(" ")
source_point = (float(source_point[0]), float(source_point[1]))
dx = 2.5
dy = 5
pad = 0.5
lon_min, lon_max = source_point[0]-dx, source_point[0]+dx
lat_min, lat_max = source_point[1]-dy, source_point[1]+dy
area = 4*dx*dy
zoom = self.get_zoom(area) ##only relevant when using a map tile
cartmap.set_extent([lat_min-pad, lat_max+pad, lon_min-pad, lon_max+pad])
#~ cartmap.add_image(self.tile, zoom)
cartmap.add_feature(cartopy.feature.LAND, zorder=1)
return cartmap
这是地标功能:
def add_point_icon(self, x, y, cartmap):
src_point = np.array(Image.open('icons/icon63.png'))
im = OffsetImage(src_point, zoom=1, alpha=1.0, zorder=3)
ab = AnnotationBbox(im, (x,y), xycoords='data', frameon=False)
cartmap.add_artist(ab)
这两个都被一个接一个地调用,如下所示:
cartmap = self.custom_background(mysrc)
#~ cartmap=self.plot
self.add_point_icon(x1, y1, cartmap)
结果:
如果我按原样运行代码,这就是地图的外观:
如果我将其更改为(即绕过绘制背景的功能):
#~ cartmap = self.custom_background(mysrc)
cartmap=self.plot
self.add_point_icon(x1, y1, cartmap)
然后我得到:
为什么我不能在地图顶部显示红色的“加号”?我尝试设置不同对象的“zorder”参数,但它似乎没有做任何事情。我现在完全不知所措。任何帮助将不胜感激,谢谢。
编辑:也许我还应该包括创建子图的行:
def __init__(self, mylevs):
self.fig, self.header, self.footer, self.plot, self.legend =
self.create_spec()
def create_spec(self):
"""Define layout of figure"""
#left column: header, footer, plt
fig = plt.figure(figsize=(12,10))
layout = 1
if layout == 1: #Default
widths = [8,1]
heights = [2, 10, 3]
column_border = 0.75
pad = 0.1
colorbar_width = 0.05
spec = gridspec.GridSpec(ncols=1, nrows=3, width_ratios = [1], height_ratios=heights, left=0.1, right = column_border)
#right column: colorbar
spec2 = gridspec.GridSpec(ncols=1, nrows=1, width_ratios = [1], height_ratios=[1], left=column_border+pad, right=column_border+pad+colorbar_width)
header = plt.subplot(spec[0,0])
footer = plt.subplot(spec[2,0])
plot = plt.subplot(spec[1,0], projection=cimgt.OSM().crs)
legend = plt.subplot(spec2[0,0])
return fig, header, footer, plot, legend
解决方案
问题是,在从地图图块切换回 Cartopy 库存背景时,我忘记将投影从 ccrs.OSM() 切换回 ccrs.PlateCarree()。在地图切片投影中,地标被绘制在查看窗口之外。
推荐阅读
- twitter-bootstrap - 引导表单控制类防止输入居中
- linux - 新的 Yocto 食谱构建但工作目录在编译后被删除
- nativescript - 具有多个项目模板切换可见性的 Nativescript 列表视图
- python - 如何创建基于 CSV 文件的字典
- matlab - 将数据集中的所有最小值提取到矩阵中
- r - 如何根据 R 中具有模式和序列的行添加新列?
- javascript - 当我在布尔值中添加一个切换时,我的函数停止工作。为什么?
- javascript - 提交带有错误消息的按钮,然后重定向位置
- c# - 获取 IIS 服务器目录路径
- c - 函数安全实践中的getline