【python海洋專題四十七】風速的風羽圖
圖片
往期推薦
圖片
【python海洋專題一】查看數據nc文件的屬性并輸出屬性到txt文件
【python海洋專題二】讀取水深nc文件并水深地形圖
【python海洋專題三】圖像修飾之畫布和坐標軸
【Python海洋專題四】之水深地圖圖像修飾
【Python海洋專題五】之水深地形圖海岸填充
【Python海洋專題六】之Cartopy畫地形水深圖
【python海洋專題】測試數據
【Python海洋專題七】Cartopy畫地形水深圖的陸地填充
【python海洋專題八】Cartopy畫地形水深圖的contourf填充間隔數調整
【python海洋專題九】Cartopy畫地形等深線圖
【python海洋專題十】Cartopy畫特定區域的地形等深線圖
【python海洋專題十一】colormap調色
【python海洋專題十二】年平均的南海海表面溫度圖
【python海洋專題十三】讀取多個nc文件畫溫度季節變化圖
【python海洋專題十四】讀取多個鹽度nc數據畫鹽度季節變化圖
【python海洋專題十五】給colorbar加單位
【python海洋專題十六】對大陸周邊的數據進行臨近插值
【python海洋專題十七】讀取幾十年的OHC數據,畫四季圖
【python海洋專題十八】讀取Soda數據,畫subplot的海表面高度四季變化圖
【python海洋專題十九】找范圍的語句進階版本
【python海洋專題二十】subplots_adjust布局調整
【python海洋專題二十一】subplots共用一個colorbar
【python海洋專題二十二】在海圖上text
【python海洋專題二十三】共用坐標軸
【python海洋專題二十四】南海年平均海流圖
【python海洋專題二十五】給南海年平均海流+scale
【python海洋專題二十六】南海海流流速圖
【python海洋專題二十七】南海四季海流圖
【python海洋專題二十八】南海四季海流流速圖
【python海洋專題二十九】讀取CTD文件數據并畫溫度點剖面圖
【python海洋專題三十】畫南海115°E的溫度剖面圖
【python海洋專題三十一】畫南海115°E的地形溫度剖面圖
【python海洋專題三十二】畫南海115°E的地形溫度流速剖面圖
【python海洋專題三十三】畫海洋表面的風場分布
【python海洋專題三十四】調用自己的colormore
【python海洋專題三十五】加密數據–二維插值
【python海洋專題三十六】兩個一維數組的相關系數–為海洋指數作準備
【python海洋專題三十七】海洋指數畫法–折線圖樣式一
【python海洋專題三十八】海洋指數畫法–折線圖樣式二
【python海洋專題三十九】海洋指數畫法–折線圖樣式三–不同顏色的線條
【python海洋專題四十】海洋指數畫法–單色填充圖
【python海洋專題四十一】海洋指數畫法–漸變填色圖
【python海洋專題四十二】海洋指數畫法–雙色柱狀圖
【python海洋專題四十三】海洋指數畫法–單色漸變柱狀圖
【python海洋專題四十四】海洋指數畫法–多色漸變柱狀圖
【python海洋專題四十五】海洋研究區域示意圖
【python海洋專題四十六】研究區域示意放大圖
【python海洋專題海洋指數畫法】大氣與海洋指數畫法匯總
【MATLAB海洋專題】歷史匯總
【matlab程序】(1-5)五坐標軸的精細修飾
【matlab程序】圖片平面制作||文末點贊分享||海報制作等
大佬推薦一下物理海洋教材吧?
【matlab海洋專題】高級玫瑰圖–風速風向頻率玫瑰圖–此圖細節較多
【上千種顏色包|全平臺可用】收集自Matlab、python、R、NCL等顏色包
R語言_RColorBrewer包–全平臺可用
海洋專用cmocean顏色包_共22種–全平臺可用
【matlab教程】matlab不規則區域的外圍填充
【海洋科普】沉積物分為粘性沉積物和非粘性沉積物
【海洋科普】黃渤海地理介紹
【科普知識】海洋尺度圖和解釋
【海洋科普】海洋環流與等高線巖特征聯系
代碼分享:
# -*- coding: utf-8 -*-
# ---導入數據讀取和處理的模塊-------
from netCDF4 import Dataset
from pathlib import Path
import xarray as xr
import numpy as np
# ------導入畫圖相關函數--------
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import matplotlib.ticker as ticker
from cartopy import mpl
import cartopy.crs as ccrs
import cartopy.feature as feature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from pylab import *
# -----導入顏色包---------
import seaborn as sns
from matplotlib import cm
import palettable
from palettable.cmocean.diverging import Delta_4
from palettable.colorbrewer.sequential import GnBu_9
from palettable.colorbrewer.sequential import Blues_9
from palettable.scientific.diverging import Roma_20
from palettable.cmocean.diverging import Delta_20
from palettable.scientific.diverging import Roma_20
from palettable.cmocean.diverging import Balance_20
from matplotlib.colors import ListedColormap
# -------導入插值模塊-----
from scipy.interpolate import interp1d # 引入scipy中的一維插值庫
from scipy.interpolate import griddata # 引入scipy中的二維插值庫
from scipy.interpolate import interp2d# ----define reverse_colourmap定義顏色的反向函數----
def reverse_colourmap(cmap, name='my_cmap_r'):reverse = []k = []for key in cmap._segmentdata:k.append(key)channel = cmap._segmentdata[key]data = []for t in channel:data.append((1 - t[0], t[2], t[1]))reverse.append(sorted(data))LinearL = dict(zip(k, reverse))my_cmap_r = mpl.colors.LinearSegmentedColormap(name, LinearL)return my_cmap_r# ---colormap的讀取和反向----
cmap01 = Balance_20.mpl_colormap
cmap0 = Blues_9.mpl_colormap
cmap_r = reverse_colourmap(cmap0)
cmap1 = GnBu_9.mpl_colormap
cmap_r1 = reverse_colourmap(cmap1)
cmap2 = Roma_20.mpl_colormap
cmap_r2 = reverse_colourmap(cmap2)
# ---read_data---
fu = xr.open_dataset(r'D:\pycharm_work\data\uwnd.mon.mean.nc')
fv = xr.open_dataset(r'D:\pycharm_work\data\vwnd.mon.mean.nc')
print(fu)
print(fu.variables['uwnd'])
lat = fu['lat'].data
lon = fu['lon'].data
u = fu['uwnd'].data
v = fv['vwnd'].data
# # # 畫圖網格
ln1 = np.where(lon >= 30)[0][0]
ln2 = np.where(lon >= 105)[0][0]
la1 = np.where(lat <= 0)[0][0]
la2 = np.where(lat <= 30)[0][0]
# time_all=[(time>=1058760) & (time<=1059096)] #13-27 Oct
# # # 畫圖網格
lon1 = lon[ln1:ln2]
lat1 = lat[la2:la1]
X, Y = np.meshgrid(lon1, lat1)
u_aim = u[:, la2:la1, ln1:ln2]
v_aim = v[:, la2:la1, ln1:ln2]
u_end = np.mean(u_aim, axis=0)
v_end = np.mean(v_aim, axis=0)
# ----plot--------------
scale = '50m'
plt.rcParams['font.sans-serif'] = ['Times New Roman'] # 設置整體的字體為Times New Roman
# 設置顯示中文字體
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["mathtext.fontset"] = 'cm' # 數學文字字體
mpl.rcParams["font.size"] = 12 # 字體大小
mpl.rcParams["axes.linewidth"] = 1 # 軸線邊框粗細(默認的太粗了)
fig = plt.figure(dpi=300, figsize=(3, 2), facecolor='w', edgecolor='blue') # 設置一個畫板,將其返還給fig
ax = fig.add_axes([0.05, 0.08, 0.92, 0.8], projection=ccrs.PlateCarree(central_longitude=180))
ax.set_extent([30, 105, 0, 30], crs=ccrs.PlateCarree()) # 設置顯示范圍
ax.add_feature(feature.OCEAN)
ax.stock_img() # 添加地球背景
# land = feature.NaturalEarthFeature('physical', 'land', scale, edgecolor='face',
# facecolor=feature.COLORS['land'])
# ax.add_feature(land, facecolor='0.8', alpha=0.2)
ax.add_feature(feature.COASTLINE.with_scale('10m'), lw=0.5, color='k') # 添加海岸線:關鍵字lw設置線寬; lifestyle設置線型
# cs = ax.quiver(X, Y, u_end, v_end, color='b',
# scale=70, zorder=3, width=0.002, headwidth=4, headlength=5.5, transform=ccrs.PlateCarree())
# ---barb_increments={'half':2,'full':4,'flag':20}這一句,修改了風矢桿長短桿線和三角分別代表的風速大小。
ax.barbs(X, Y, u_end, v_end, barb_increments={'half': 0.5, 'full': 1, 'flag': 3}, zorder=5,length=3.5, linewidth=0.4, transform=ccrs.PlateCarree())
# --------------添加標題----------------
ax.set_title('印度洋海表面風速(風羽圖)', loc="center", fontsize=6, pad=1)
# ------------------利用Formatter格式化刻度標簽-----------------
ax.set_xticks(np.arange(30, 106, 10), crs=ccrs.PlateCarree()) # 添加經緯度
ax.set_xticklabels(np.arange(30, 106, 10), fontsize=4)
ax.set_yticks(np.arange(0, 31, 5), crs=ccrs.PlateCarree())
ax.set_yticklabels(np.arange(0, 31, 5), fontsize=4)
ax.xaxis.set_major_formatter(LongitudeFormatter())
ax.yaxis.set_major_formatter(LatitudeFormatter())
ax.tick_params(axis='x', top=True, which='major', direction='in', length=3, width=0.8, labelsize=5, pad=0.8,color='k') # 刻度樣式 pad代表標題離軸的遠近
ax.tick_params(axis='y', right=True, which='major', direction='in', length=3, width=0.8, labelsize=5, pad=0.8,color='k') # 更改刻度指向為朝內,顏色設置為藍色
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=False, xlocs=np.arange(30, 106, 10), ylocs=np.arange(0, 31, 5),linewidth=0.25, linestyle='--', color='k', alpha=0.8) # 添加網格線
gl.top_labels, gl.bottom_labels, gl.right_labels, gl.left_labels = False, False, False, False
plt.savefig('wind_feather_indian_ocean_1.jpg', dpi=600, bbox_inches='tight', pad_inches=0.1) # 輸出地圖,并設置邊框空白緊密
plt.show()