首页 > 解决方案 > 如何使用地理数据框中的第一行在图形上创建文本框?

问题描述

我希望在显示热带气旋的 5 天 NHC 预报锥的图形上绘制一个文本框,在本例中为飓风多利安。我有四个 shapefile(轨迹线、圆锥、点和手表/警告)。在图中,我想从 points_gdf 的第一行显示以下内容(图像中的黄色圆圈;代码底部附近的两条注释掉的行是我最初尝试的):

最新跟踪信息:(常规字符串;以下是来自 points_gdf 的变量)
LAT LON
MAXWIND
GUST
MSLP
TCSPD

在此处输入图像描述 在此处输入图像描述

track_line_gdf = geopandas.read_file('nhc/al052019_5day_037/al052019-037_5day_lin.shp')
cone_gdf = geopandas.read_file('nhc/al052019_5day_037/al052019-037_5day_pgn.shp')
points_gdf = geopandas.read_file('nhc/al052019_5day_037/al052019-037_5day_pts.shp')
ww_gdf = geopandas.read_file('nhc/al052019_5day_037/al052019-037_ww_wwlin.shp')

fig = plt.figure(figsize=(14,12))
fig.set_facecolor('white')
ax = plt.subplot(1,1,1, projection=map_crs)
ax.set_extent([-88,-70,25,50])

ax.add_geometries(cone_gdf['geometry'], crs=data_crs, facecolor='white',
              edgecolor='black', linewidth=0.25, alpha=0.4)
ax.add_geometries(track_line_gdf['geometry'], crs=data_crs, facecolor='none',
              edgecolor='black', linewidth=2)
sc = ax.scatter(points_gdf['LON'], points_gdf['LAT'], transform=data_crs,
       zorder=10, c=points_gdf['MAXWIND'], cmap='jet')

ww_colors = {'Tropical Storm Watch': 'gold',
         'Hurricane Watch': 'pink',
         'Tropical Storm Warning': 'tab:blue',
         'Hurricane Warning': 'tab:red'}

for ww_type in ww_colors.keys():
    ww_subset = ww_gdf[ww_gdf['TCWW']==ww_type]
    ax.add_geometries(ww_subset['geometry'], facecolor='none',
                      edgecolor=ww_colors[ww_type], crs=data_crs,
                      linewidth=5)

markers = [plt.Line2D([0,0],[0,0],color=color, marker='o', linestyle='') for color in ww_colors.values()]

Name = ww_gdf['STORMNAME'][0]
Storm = ww_gdf['STORMTYPE'][0]
AdvDate = ww_gdf['ADVDATE'][0]
AdvNum = ww_gdf['ADVISNUM'][0]
props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)

plt.colorbar(sc, label='Wind Speed (mph)')
plt.title(Storm + ' ' + Name + ' - ' + AdvDate + ' Advisory', fontsize=14, fontweight='bold')
plt.legend(markers, ww_colors.keys())
plt.text(0.05, 0.95, 'Testing', transform=ax.transAxes, va='top', bbox=props)

标签: matplotlibcartopy

解决方案


这将有助于了解您遇到了什么错误,或者究竟是什么行为不符合您的要求。我可以稍微调整你的代码来做到这一点:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(14,12))
fig.set_facecolor('white')
ax = plt.subplot(1,1,1, projection=ccrs.LambertConformal())

plt.title('Storm Advisory', fontsize=14, fontweight='bold')

points_gds = pd.DataFrame(dict(GUST=[165.0], LAT=[26.8],
                          LON=[-78.3], MSLP=[930.2]))

storminfo = f'''Max Wind Gusts: {points_gds.iloc[0]['GUST']:.0f} mph
Current Latitude: {points_gds.iloc[0]['LAT']:.1f}
Current Longitude: {points_gds.iloc[0]['LON']:.1f}
Central Pressure: {points_gds.iloc[0]['MSLP']:.2f} mb'''

props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)
plt.text(0.05, 0.95, 'Testing', transform=ax.transAxes, va='top', bbox=props)

ax.coastlines()
ax.set_extent([-88,-70,25,50])

生成此图像:

带有文本框的示例图像

为了完成这项工作,我需要将round(这是一个 Python 内置函数)更改为 string 'round'。文本使用f 字符串(“格式化字符串文字”)进行格式化,并作为三引号字符串括起来,以避免需要手动输入换行符 ( '\n') 字符。Python 的文档可以告诉你更多关于如何控制单个项目的格式。


推荐阅读