使用python Basemap测站分布图(含站名)
生活随笔
收集整理的這篇文章主要介紹了
使用python Basemap测站分布图(含站名)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用python 繪制地圖并在地圖上繪制坐標點
文章目錄
- 使用python 繪制地圖并在地圖上繪制坐標點
- 1. 引言
- 2.繪制一張簡單的地圖
- 3.測站坐標數據讀取
- 4.在地圖上繪制點
- 5. adjustText解決plt.text()文字重疊的問題
- 6.刪除多余冗余的legend
1. 引言
? 本來想詳細寫一寫Basemap的詳細使用,但是看到了已經有人寫得非常詳細,如果想使用Basemap 的同學強烈推薦這篇文章我用Python之basemap畫圖27問 ,本文就從挑選其中一方面詳細介紹一下,并對其中未提到的一些細節補充一下。
? 本文將詳細介紹如何使用Python (Basemap庫函數)繪制一張美觀的測站分布圖(解決了plt.text()文字重疊的問題,以及標簽的設置),先上最終結果圖,分布圖包含了測站的名稱和接收機類型。首先上最終效果圖:
關于Basemap的安裝,教程很多不再贅述,自行百度,傳送門傻瓜式教學:window下安裝basemap。關于Basemap的使用,必須再次推薦一下篇文章:我用Python之basemap畫圖27問
2.繪制一張簡單的地圖
繪制地圖,確定地圖的經緯度范圍,添加海岸線、經緯線,添加國家線、顏色設置,透明度設置。 from mpl_toolkits.basemap import Basemap #導入Basemap庫 import matplotlib.pyplot as plt #import pandas as pd#styles = plt.style.available #plt.style.use(['science', 'high-vis', 'no-latex'])plt.rcParams['font.family'] = 'Arial' # 設置字體樣式 plt.rcParams['font.weight'] = 'bold' #加粗 #繪制地圖 加入站點 plt.figure(figsize=(40, 30)) #它的參數figsize=(16,8)定義了圖的大小。 m = Basemap() #使用Basemap()創建一個地圖 # 限定地圖的范圍 """m = Basemap(llcrnrlon= lons[0],llcrnrlat=lats[0],urcrnrlon=lons[1],urcrnrlat=lats[1],projection='merc',lat_1=33,lat_2=45,lon_0=100) #使用Basemap()創建一個地圖""" m.drawcoastlines() #把海岸線畫上 m.drawcountries(color='grey', linewidth=2) # 開始畫上國家# 填充陸地、胡泊、海洋的顏色 m.fillcontinents(color='g', # 陸地顏色lake_color='b', # 湖泊顏色alpha=0.2) #m.drawmapboundary(fill_color='blue') # 填充海洋# 添加經緯線 m.drawmeridians(np.arange(0, 360, 30),#設置緯線的其實范圍,以及維度的間隔color='pink', # 顏色linewidth=8, # 線寬labels=[1, True, 0, True],fontsize=50, ) m.drawparallels(np.arange(-90, 90, 30),color='green', # 顏色linewidth=8, # 線寬labels=[1, True, 0, 1],fontsize=50, )效果如如下:
?
?
3.測站坐標數據讀取
import pandas as pd from collections import OrderedDict from adjustText import adjust_text styles = plt.style.available plt.style.use(['science', 'high-vis', 'no-latex'])filepath = r'F:\MP Summary\B1IB2IB3I.csv' filepath = r'F:\MP Summary\B1CB2aB2b.csv' fpath = r'F:\Thesis\Results\GPS\endoutput\statistic.txt' #fpath = r'F:\Thesis\Results\TRIMBLE_GPS\endoutput\statistic.txt'data = pd.read_csv(filepath, ) d = data.set_index(data['staname']) sta = list(d['staname']) rectype = list(d['RecType']) tp = list(d.drop_duplicates(subset=['RecType'], keep='first')['RecType']) stainfo = {sta[i]: rectype[i] for i in range(len(sta))} colors = ['blue', 'r', 'black', 'm', 'darkolivegreen', 'purple', 'dodgerblue','brown' ] rec_color = {tp[i]: colors[i] for i in range(len(tp))} colormap = {sta[i]: rec_color[stainfo[sta[i]]] for i in range(len(sta))} #不同接收機類型映射不同的顏色StationPos = pd.read_table(fpath,sep=r'\s+',skiprows=0,engine='python',header=None) StationPos = pd.DataFrame(StationPos).loc[:, (0, 2, 3)].drop_duplicates() StationPos.columns = ['StaName', 'latitude', 'longitude']StationPos.index = range(0, len(StationPos.index)) StationPos = StationPos.drop_duplicates(subset=['StaName'], keep='first') StationPos = StationPos[StationPos['StaName'].isin(sta)]#StationPos = StationPos.loc[0:(StaNum-1),:]; #-----------需要繪制的站點的經緯度信息測站名稱----------# lon = list(StationPos.longitude) #on = StationPos.longitude; lat = list(StationPos.latitude) #at = StationPos.latitude; staname = list(StationPos.StaName) print('lon:{}\n lat:{}\n staname:{}\n'.format(lon,lat,staname)) lon:[149.0, 74.7, -52.8, 21.0, -4.4, 5.1, -4.0, -15.6, -104.0, -68.8, -69.4, 116.2, -46.0, -22.0, -120.9, 144.9, -76.8, 14.8, 141.8, -147.5, -156.3, 39.6, -66.6, 148.3, -149.6, -108.1, -114.5, 114.4, 12.9, 87.6, -65.4, 107.1, 6.4, -52.7, 55.5, -67.8, -67.8, 121.0, 13.1, 170.5, 11.9, 141.1, 24.4, 45.3, -57.9, -61.0, 12.4, 70.3, -52.6, 21.0, 114.5, 14.8, 127.9, -45.0, -4.5, -71.5, -149.6, 4.4, 66.9, -28.0, 20.3, 21.1, 120.2, 118.4]lat:[-35.3, 42.7, 5.3, 67.9, 40.5, 50.0, 40.4, 27.8, 30.7, 76.5, -35.8, -31.0, 60.7, 70.5, 40.0, 13.6, 39.0, 49.9, 43.5, 65.0, 20.7, -69.0, 46.0, -33.0, -17.6, 34.3, 62.5, 30.5, 49.1, 43.8, -24.7, 47.9, 51.0, 47.6, -4.7, -53.8, -53.8, 14.5, 52.4, -45.9, 78.9, 39.1, 60.2, -12.8, -34.9, 14.6, 51.4, -49.4, 5.1, 52.1, 30.5, 49.9, 35.6, -22.7, 48.4, -16.5, -17.6, 50.8, 39.1, 39.1, 49.0, 67.9, 23.0, 24.5]staname:['str2', 'pol2', 'kour', 'kiru', 'cebr', 'redu', 'vill', 'mas1', 'mgo5', 'thu2', 'mgue', 'nnor', 'qaq1', 'scor', 'quin', 'guam', 'godn', 'gop6', 'stk2', 'gcgo', 'mao0', 'syog', 'unb3', 'park', 'faa1', 'pie1', 'yel2', 'wuh2', 'wtzs', 'urum', 'unsa', 'ulab', 'tit2', 'stj3', 'seyg', 'rio2', 'rgdg', 'ptgg', 'pots', 'ous2', 'nya2', 'mizu', 'metg', 'mayg', 'lpgs', 'lmmf', 'leij', 'krgg', 'koug', 'joze', 'jfng', 'gope', 'gamg', 'chpg', 'brst', 'areg', 'thtg', 'brux', 'kit3', 'enao', 'ganp', 'kir8', 'cksv', 'kmnm'] ```4.在地圖上繪制點
#----------在地圖上繪制坐標點,添加文字------------# for i in range(len(staname)):m.scatter(lon[i],lat[i],s=150,c=colormap[staname[i]],marker='o',label=stainfo[staname[i]]) #此處可以直接使用 m.scatter(lon,lat)#---------在坐標點添加文字------# plt.text(lon, #坐標lat,staname, #文字字符串fontsize=40,style="italic",weight="light",verticalalignment='center',horizontalalignment='right',rotation=0)) #給散點加標簽?
?
繪制的地圖存在著兩個問題:
- legend標簽重復
- 文字重疊
5. adjustText解決plt.text()文字重疊的問題
文字重疊解決起來非常麻煩,但是誰讓它遇到的是除了生小孩無所不能的python 呢。python為我們提供了一個庫函數很好的解決了plt.text()文字重疊的問題。
關于這個庫函數的更多使用細節請看:
adjustText解決matplotlib plt.text()文字重疊問題
?
?
6.刪除多余冗余的legend
我們看到圖中有很多重復的圖例可以使用以下方法刪除
plt.legend(loc ='best') #save_steps=True,save_prefix=savepath) #----------設置圖片的標題---------------# plt.title('Station(B1CB2aB2b) Distribution Map ',loc='center',fontsize=50,c='black',verticalalignment='top', ) # bbox=dict(facecolor='g', edgecolor='b', alpha=0.65 )); #設置標題邊框jk plt.tight_layout() #----------刪除多余重復圖例----------------------# handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(),by_label.keys(),loc='upper right',fontsize='xx-large')# plt.savefig(savepath + 'Station_Distribution_Map_B1C2.svg',#保存圖片 # bbox_inches='tight', # dpi=600) #dpi = 300); #保存站點圖 plt.show() #顯示這個地圖最后我們就能夠得到一張測站分布圖啦
總結
以上是生活随笔為你收集整理的使用python Basemap测站分布图(含站名)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北斗七星图
- 下一篇: 单片机外围电路设计之二:电容