gpt4 book ai didi

python - 将子图放置在 cartopy 中的纬度/经度坐标处

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:28 24 4
gpt4 key购买 nike

我正在尝试将 matplotlib 轴放置在 cartopy 图上的特定坐标处,但不知道如何正确设置位置。代码应该:

  • 绘制德国的正投影
  • 在柏林的位置添加文本“柏林”
  • 在柏林的位置添加直方图

我的代码如下:

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

plt.figure(figsize=(8, 8))

extent = [6, 15, 47, 55] # Extent of Germany in Lat/Long

lat, lon = 52.520007, 13.404954 # Location of Berlin

# Plot our coastline and set the extent
ax = plt.axes(projection=ccrs.Orthographic(central_longitude=10.5, \
central_latitude=51.0, \
globe=None))
ax.coastlines('10m')
ax.set_extent(extent)

# Add text at the location of Berlin
plt.text(lon, lat, 'Berlin', \
verticalalignment='center', \
horizontalalignment='right', \
transform=ccrs.PlateCarree())

# Add subplot
sub_ax = plt.axes([(lon-extent[0])/(extent[1] - extent[0]), \
(lat-extent[2])/(extent[3] - extent[2]), \
.1, .1], \
axisbg='none')

plt.hist(np.random.randn(100), 10, normed=1)

Code output

如您所见,直方图不在柏林,因为(我推测)它是相对于图形的边界框而不是轴。我试过像添加 plt.text 一样添加 transform=ax.transAxes,但这会在 上产生 unhashable type 错误BboxTransformTo.

我应该补充一点,我知道我的位置计算通常不起作用,因为我没有使用欧几里德几何,但就我的目的而言,它已经足够接近了。

最佳答案

以下代码应获取相对于图形边缘的所需位置:

ax_lon = (lon-extent[0])/(extent[1] - extent[0])
ax_lat = (lat-extent[2])/(extent[3] - extent[2])
fig_lon = (ax.bbox.x0 + ax_lon * ax.bbox.width) / fig.bbox.width
fig_lat = (ax.bbox.y0 + ax_lat * ax.bbox.height) / fig.bbox.height

但是如果调整图形的大小,这些值就会出错。我能想到的在调整大小时将其保持在正确位置的唯一方法是使用事件回调来更新位置。

关于python - 将子图放置在 cartopy 中的纬度/经度坐标处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41716553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com