python繪制風場方向和大小quiver問題
最近需要根據(jù)再分析資料的U風和V風分析背景場的風場走向和大小,需要在地圖上繪制風場箭頭。
先看一下結(jié)果:

長度代表風速大小,箭頭指向代表風向。繪制的經(jīng)緯度區(qū)間由計算的經(jīng)緯度數(shù)組決定。
一、python調(diào)用quiver繪制風場箭頭
風場主要是用箭頭表示風的方向和大小,python中調(diào)用的方法為:
Axes.quiver(*args, data=None, **kw)
調(diào)用quivers的形式:
quiver(X, Y, U, V, C, **kw)
X、Y是箭頭的位置,U、V是箭頭數(shù)據(jù)(data),C是箭頭的顏色。
如果X、Y不存在(absent),他們將作為均勻網(wǎng)格被生成。
默認設置會自動將箭頭的長度縮放到合理的大小。要改變箭頭的長度請參看 scale 和scale_units兩個關鍵字參數(shù)。
quiver函數(shù)的參數(shù):
X: 1D or 2D array, sequence, optional 1維或2維數(shù)組,序列(sequence),可自選(optional),箭頭位置的x坐標 Y: 1D or 2D array, sequence, optional 1維或2維數(shù)組,序列,可自選,箭頭位置的y坐標 U: 1D or 2D array or masked array, sequence 1維或2維數(shù)組或掩碼數(shù)組(參看masked array https://blog.csdn.net/liukai2918/article/details/78419302),序列,箭頭矢量的x分量 V: 1D or 2D array or masked array, sequence 1維或2維數(shù)組或掩碼數(shù)組,序列,箭頭矢量的y分量 C: 1D or 2D array, sequence, optional 1維或2維數(shù)組,序列(sequence),可自選,箭頭顏色 units(單位): [ 'width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy' ] 箭頭尺寸(除長度外)以此單位的倍數(shù)計算——即是說選定單位后,箭頭尺寸即是此單位的倍數(shù) ‘width'或'height':軸(axis)的寬度或高度 ‘dots'或'inches':像素或英寸,基于圖的dpi ‘x', ‘y'或‘xy':分別是X、Y或X2+Y2的數(shù)據(jù)單位(data units) 箭頭依單位不同而不同。對于'x'或'y',箭頭會隨著其一的增大(zoom in)而增大;對于其他單位,箭頭的大小與縮放狀態(tài)(zoom state)無關。對于'width'或'height',當窗口重置時,箭頭的大小會隨著軸(axes)的寬度和高度的增大而增大;低于同意'dots'或'inches'。重置不會改變箭頭。 angles: [‘uv' | ‘xy'], array, 可自選 用于決定箭頭角度的方法,默認是'uv' ‘uv':箭頭的縱橫比(axis aspect ratio)為1,所以若U*==*V,則繪圖上箭頭的方向與水平軸逆時針呈45度(正向右)。 ‘xy': 箭頭從(x,y)指向(x + u,y + v)。例如,使用它來繪制漸變場(gradient field)。 或者,可以將任意角度指定為以水平軸逆時針方向的度數(shù)值的數(shù)組。 注意:反轉(zhuǎn)數(shù)據(jù)軸將相應地僅使用angles='xy'反轉(zhuǎn)箭頭。 scale : None, float, optional 每個箭頭長度單位的數(shù)據(jù)單位數(shù)量,例如,每個繪圖寬度m / s;參數(shù)scale越小箭頭越長。默認是None 若是None,一個簡單的自動縮放算法將被采用,基于平均矢量長度和適量的數(shù)量。箭頭長度單位由scale_units參數(shù)給出。 width : scalar(標量), optional 箭桿(shaft)的寬度,以箭頭單位衡量。默認是由以上單位的選擇和矢量數(shù)量來決定。常用的初始值是0.005倍的畫的寬度(width of the plot) headwidth : scalar, optional 頭部寬度相對于箭桿寬度的倍數(shù),默認是3倍 headlength : scalar, optional 軸交叉處的頭部長度,默認是4.5
二、python在地圖上繪制風場
1. 數(shù)據(jù)準備
quiver(X, Y, U, V, C, **kw)
X:經(jīng)度,這里使用一維數(shù)組Y:緯度,這里使用一維數(shù)組U:U風,根據(jù)經(jīng)緯度從數(shù)據(jù)集中提取的U風,一維數(shù)組V:V風,根據(jù)經(jīng)緯度從數(shù)據(jù)集中提取的V風,一維數(shù)組C:顏色,隨便設置
width:0.005
scale:200 設置箭頭比例,可以自行調(diào)節(jié)嘗試
headwidth:2
m.quiver(x, y, u_wind, v_wind, color='deepskyblue', width=0.005, scale=200, headwidth=2)
經(jīng)緯度設置:
# 用兩個列表存儲研究區(qū)域的經(jīng)緯度,這里取正負5°的區(qū)間。
lonlist = []
latlist = []
for k in np.linspace(appro_lat - 5, appro_lat + 5, 21):
for i in np.linspace(appro_lon - 5, appro_lon + 5, 21):
lonlist.append(i)
latlist.append(k)U,V風提?。?/p>
u_wind = []
v_wind = []
for i in range(len(lonlist)):
u_wind.append(nc_obj.variables['u10'][time_index][latitude.index(latlist[i])][longitude.index(lonlist[i])])
v_wind.append(nc_obj.variables['v10'][time_index][latitude.index(latlist[i])][longitude.index(lonlist[i])])這里都是用一維數(shù)組表示,具體的情況將根據(jù)自己的需要設置。
2. 在地圖上繪制風場箭頭
fig = plt.figure(figsize=(8, 6))
m = Basemap(projection='cyl', llcrnrlat=min(latlist), llcrnrlon=min(lonlist), urcrnrlat=max(latlist),
urcrnrlon=max(lonlist)) # 使用Basemap獲取地圖
# 通過readshapefile讀取地圖文件shp
m.readshapefile(CN_pro', 'states') // 根據(jù)自己的需要readshapefile讀取地圖文件
m.drawcoastlines(color='black')
m.drawstates(color='black')
m.drawcountries(color='black')
x, y = m(*(lonlist, latlist)) # 將lats / lons轉(zhuǎn)換為地圖投影坐標
m.drawmeridians(np.arange(math.ceil(min(lonlist)), int(max(lonlist)), 5), labels=[0, 0, 0, 1])
m.drawparallels(np.arange(math.ceil(min(latlist)), int(max(latlist)), 5), labels=[1, 0, 0, 0])
# 在地圖上繪制BestTrack的經(jīng)緯度
best_lon, best_lat = m(lon[t], lat[t])
# 在地圖上繪制點
m.plot(best_lon, best_lat, 'o', color='red', ms=5)
# 繪制風場箭頭
m.quiver(x, y, u_wind, v_wind, color='deepskyblue', width=0.005, scale=200, headwidth=2)
plt.show()需要在地圖上繪制衛(wèi)星云圖亮溫值請參考:python繪制登陸時的衛(wèi)星云圖(TBB)。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
TensorFlow利用saver保存和提取參數(shù)的實例
今天小編就為大家分享一篇TensorFlow利用saver保存和提取參數(shù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python快速實現(xiàn)分列轉(zhuǎn)到行的示例代碼
這篇文章主要為大家詳細介紹了如何利用Python快速實現(xiàn)分列轉(zhuǎn)到行的效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學一下2023-03-03
django自定義Field實現(xiàn)一個字段存儲以逗號分隔的字符串
這篇文章主要介紹了django自定義Field實現(xiàn)一個字段存儲以逗號分隔的字符串的示例,需要的朋友可以參考下2014-04-04

