首页 > 解决方案 > Python底图:将图例高度调整为地图区域

问题描述

使用底图绘制时,我可以定义绘制地图的区域(例如 by ax1 = fig.add_axes([0.05, 0.05, 0.75, 0.9]))和绘制图例的位置(例如 by ax2 = fig.add_axes([0.85, 0.1, 0.05, 0.8]))。根据投影和要绘制的地理区域,地图不会覆盖 ax1 预定义的区域(在我的情况下,垂直范围远小于 0.9),但我的图例的垂直范围仍然是 0.8。

当我尝试通过 transFigure.inverted 获取最小和最大 y 图形坐标以缩放图例垂直范围以使其具有与地图相同的垂直范围时,我将无法获得正确的坐标。它们仍然是 0.05 和 0.95,尽管由于情节的原因它们应该更大/更小。

如何在图形坐标中获得正确的地图范围? 在此处输入图像描述

这是代码:

import matplotlib as mpl
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(6, 6))
ax1 = fig.add_axes([0.05, 0.05, 0.75, 0.9])
# mp                                                                                                                                                                                                        
lon0 = 11.35
lat0 = 50.0
lon1 = 15.5
lat1 = 50.0
lon2 = 15.5
lat2 = 52.0
lon3 = 11.35
lat3 = 52.0
lat_c = (lat0 + lat2) / 2.0
lon_c = (lon0 + lon2) / 2.0
map = Basemap(projection='merc', lat_0 = lat_c, lon_0 = lon_c,
resolution = 'h', area_thresh = 0.1,
llcrnrlon=lon0, llcrnrlat=lat0,
urcrnrlon=lon2, urcrnrlat=lat2)
map.drawcountries(zorder=10)
cmap = mpl.cm.get_cmap('jet')
# get min and max value for legend test                                                                                                                                                                     
min_overall =  0.0
max_overall = 10.0

# plot blue dots for predefined map edges                                                                                                                                                                   
x0_data, y0_data = map(lon0,lat0) # lower left                                                                                                                                                              
map.plot(x0_data, y0_data, 'bo', markersize=24)
x1_data, y1_data = map(lon1,lat1) # lower right                                                                                                                                                             
map.plot(x1_data, y1_data, 'bo', markersize=24)
x2_data, y2_data = map(lon2,lat2) # upper right                                                                                                                                                             
map.plot(x2_data, y2_data, 'bo', markersize=24)
x3_data, y3_data = map(lon3,lat3) # upper left                                                                                                                                                              
map.plot(x3_data, y3_data, 'bo', markersize=24)

# convert data to display coordinates                                                                                                                                                                       
x0_y0_display = ax1.transData.transform((x0_data,y0_data))
inv_ax1_transData = ax1.transData.inverted()
x0_y0_data_test = inv_ax1_transData.transform(x0_y0_display)
x3_y3_display = ax1.transData.transform((x3_data,y3_data))

# convert display to figure coordinates                                                                                                                                                                     
inv_fig_transFigure = fig.transFigure.inverted()
x0_y0_figure = inv_fig_transFigure.transform(x0_y0_display)
x3_y3_figure = inv_fig_transFigure.transform(x3_y3_display)
print(x0_y0_figure)
print(x3_y3_figure)

# convert data to display coordinates                                                                                                                                                                       
x0_y0_display = ax1.transData.transform((x0_data,y0_data))
inv_ax1_transData = ax1.transData.inverted()
x0_y0_data_test = inv_ax1_transData.transform(x0_y0_display)
x3_y3_display = ax1.transData.transform((x3_data,y3_data))
print(x0_y0_figure)
print(x3_y3_figure)

# set colorbar                                                                                                                                                                                             
cmap = mpl.cm.get_cmap('jet')
ax2 = fig.add_axes([0.85, 0.1, 0.05, 0.8])
norm = mpl.colors.Normalize(vmin=min_overall, vmax=max_overall)
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap=cmap,
                            norm=norm,
                            orientation='vertical')
cb1.set_label('Test')
plt.show()

标签: pythonmatplotlibmatplotlib-basemap

解决方案


好的,似乎解决方案似乎很简单:所需的一切都存储在第一个轴(ax1)的 Bbox 中:所以添加到代码中:

bb = ax1.get_position() # get Bbox from ax1                                                                                                                                                                 

将为 ax1 提供 Bbox 实例,其中包含在图形坐标中绘制地图真正需要的边缘

values_bb = bb.get_points()

将提供 Bbox 边缘的坐标

ax2 = fig.add_axes([0.85, values_bb[0,1], 0.05, values_bb[1,1]-values_bb[0,1]])

将图例的轴缩放到适当的垂直范围


推荐阅读