python - 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()
解决方案
好的,似乎解决方案似乎很简单:所需的一切都存储在第一个轴(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]])
将图例的轴缩放到适当的垂直范围
推荐阅读
- typescript - 无法使用玩笑模拟 S3 `deleteObjects`
- visual-studio-code - 远程 ssh 连接失败,在 vscode 的输出中出现此错误消息(我正在使用 ssh 扩展从 linux 服务器 18 连接到 mac)
- r - 控制许多拼凑而成的 ggplots 的宽度
- c# - 无法将“System.DBNull”类型的对象转换为“System.DateTime”类型
- sql - SQL Server 2019 标量函数返回前 9 个字符不是完整的结果
- angular - Angular 多组件通过服务共享数据不起作用
- spring - Spring Boot OAuth2 登录端点不起作用。点击默认路径时获取 404
- web-scraping - 维基百科:“新形式的网络抓取涉及监听来自网络服务器的数据馈送”。这意味着什么?
- azure - Azure 数据湖存储 Gen2 权限
- python - 使用 xarray 在大 dask 数组上重新采样和 groupby - 使用 map_blocks?