站點數(shù)據(jù)也是氣象數(shù)據(jù)很重要的一部分,尤其是在觀測數(shù)據(jù)方面,站點數(shù)據(jù)一般存放于.txt(.csv)文件中,在"Python氣象數(shù)據(jù)處理與繪圖(1):數(shù)據(jù)讀取"中提到過這類文件的讀取,那么今天以一個例子再重新復習一哈。
首先我們先去讀站點信息文件"SURF_CLI_CHN_TEM_station.txt"

文件的列分別為站號,緯度,經(jīng)度,海拔
data = pd.read_csv("SURF_CLI_CHN_TEM_station.txt",sep='\s+',header=None, names=['station','lat','lon','high'])
print(data)
讀取結果是這樣的

sep='\s+' :指定每一列的間隔符是空格(正則表達),如果間隔是“,”的話,那么sep=','便可。
header=None :不讀取文件頭。
names=['station','lat','lon','high'] :指定各列名稱,方便調用。
接下來是畫圖部分,我們需要在地圖上展示站點的分布,散點圖則是最符合我們需要的。
根據(jù)“Python氣象數(shù)據(jù)處理與繪圖(3)”的代碼,我們可以先繪制出中國地圖(有人說3說的不詳細,那我這次就再仔細說說):
#建立畫布(這部分沒啥好說的,跳過)
fig2 = plt.figure(figsize=(15,15))
proj = ccrs.PlateCarree(central_longitude=105)
leftlon, rightlon, lowerlat, upperlat = (70,140,15,55)
#繪制地圖
f2_ax1 = fig2.add_axes([0.1, 0.1, 0.5, 0.3],projection = proj)
#在畫布的絕對坐標建立子圖
f2_ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=ccrs.PlateCarree())
#海岸線,50m精度
f2_ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))
#湖泊數(shù)據(jù)(但是這個貌似只畫了比較大的湖泊,比如貝湖巴湖)
f2_ax1.add_feature(cfeature.LAKES, alpha=0.5)
#以下6條語句是定義地理坐標標簽格式
f2_ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=ccrs.PlateCarree())
f2_ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs=ccrs.PlateCarree())
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
f2_ax1.xaxis.set_major_formatter(lon_formatter)
f2_ax1.yaxis.set_major_formatter(lat_formatter)
f2_ax1.set_title('Station',loc='center',fontsize =15)
#讀取shp文件
china = shpreader.Reader('bou2_4l.dbf').geometries()
#繪制中國國界省界九段線等等
f2_ax1.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black',zorder = 1)
#添加南海,實際上就是新建一個子圖覆蓋在之前子圖的右下角
f2_ax2 = fig2.add_axes([0.5175, 0.0935, 0.08, 0.13],projection = proj)
f2_ax2.set_extent([105, 125, 0, 25], crs=ccrs.PlateCarree())
f2_ax2.add_feature(cfeature.COASTLINE.with_scale('50m'))
china = shpreader.Reader('/data/home/zenggang/yxy/shp/bou2_4l.dbf').geometries()
f2_ax2.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black',zorder = 1)
圖的效果是這樣的:

這里插幾句嘴,大家一定要用國內(nèi)提供的中國shp文件,用cartopy官方提供的文件在處理涉及中國行政區(qū)劃或者類似問題的時候非常麻煩,更別提南海九段線的問題,不建議使用。
而接下來我們要將站點的分布繪制上去。以下是散點圖的繪圖函數(shù):

我們只需在兩個子圖分別添加
f2_ax1.scatter(data["lon"],data["lat"],s =4,transform=ccrs.PlateCarree())
f2_ax2.scatter(data["lon"],data["lat"],s = 4,transform=ccrs.PlateCarree())
效果是這樣的:

因為站點太密集了所以我的點的大小設置的比較小,密恐抱歉(點的大小通過修改s控制)。
這是二維的分布,如果我們想看三維分布咋辦呢,也就是添加上站點的海拔信息,這只需要將上述代碼改為:
f2_ax1.scatter(data["lon"],data["lat"],s =2,c=data["high"],cmap='jet',transform=ccrs.PlateCarree())
“jet”為jet色板,c為顏色,實際上就是講站點海拔信息標準化作為顏色數(shù)組,在jet色板中排列挑選對應顏色。
最終效果圖為:

這里c只是為站點海拔,同樣,可以替換為該站點的溫度,濕度,降水,高溫日數(shù)等等,靈活運用實達到自己的目的。