问题描述
我希望在一个图形上绘制一个文本框,显示热带气旋的 5 天 NHC 预报锥,在这种情况下是飓风多里安。我有四个 shapefile(轨迹线、锥体、点和手表/警告)。在图中,我想从 points_gdf 的第一行显示以下内容(图像中的黄色圆圈;代码底部附近的两条注释掉的行是我最初尝试的):
最新跟踪信息:(常规字符串;以下是来自points_gdf的变量)
拉特隆
最大风
阵风
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,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'],facecolor='none',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'],edgecolor=ww_colors[ww_type],linewidth=5)
markers = [plt.Line2D([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)
解决方法
了解您遇到了什么错误,或者究竟是什么行为不符合您的意愿会有所帮助。我可以稍微调整一下你的代码来做到这一点:
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,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 内置函数)更改为字符串 'round'
。文本使用 f-strings(“格式化字符串文字”)进行格式化,并用三引号括起来,以避免需要手动放入换行符 ('\n'
) 字符。 Python's docs 可以告诉您有关如何控制单个项目格式的更多信息。