用python的Basemap画地图设置标准刻度线

本文内容来源于:https://blog.csdn.net/ssy8stephy/article/details/106525026

用Basemap畫空白地圖時的代碼如下

plt.figure(figsize=(10,6.25),dpi=512)
ax=plt.subplot(1,1,1)
m=Basemap(projection='cyl',llcrnrlat=-90.,urcrnrlat=90.,llcrnrlon=-180.,urcrnrlon=180.,resolution='l')
m.drawcoastlines(color='dimgray',linewidth=1.5,zorder=250)
m.drawparallels(np.arange(-90.,90.1,15.),dashes=[0.001,1000],labels=[1,0,0,0],size=10,linewidth=0.5,color='gray',zorder=450)
m.drawmeridians(np.arange(0.,360.,60.),dashes=[0.001,1000],labels=[0,0,0,1],size=10,linewidth=0.5,color='gray',zorder=450)
m.fillcontinents(color='0.85', lake_color=None, ax=None, alpha=None)

其中這兩句代表xticklabel和yticklabel要畫哪幾個值,在這裏經度是畫0, 60, 180, 240, 300 和360這幾個值的。

m.drawparallels(np.arange(-90.,90.1,15.)
m.drawmeridians(np.arange(0.,360.,60.)

畫出來效果大概是這樣

 

 

 如果想擁有如下圖所示的刻度,可以加上這幾句

 

##--little line--##
import matplotlib.ticker as ticker
ax.xaxis.set_major_locator(ticker.MultipleLocator(45))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(10))
ax.yaxis.set_major_locator(ticker.MultipleLocator(60))
ax.yaxis.set_minor_locator(ticker.MultipleLocator(10))
ax.tick_params(which='major',width=2.00,length=10,direction='in',labelsize=0)
ax.tick_params(which='minor',width=1.00,length=5,direction='in',labelsize=0)

ax.tick_params裏的labelsize設為0是因為我們用m.drawparallels和m.drawmeridians畫了tickslabel了,如果不設為0,tickslabel會畫2次。

畫出來效果如下圖所示,刻度和ticklabel太靠近了,導致有點重疊。在m.drawparallels和m.drawmeridians中我找不到設節它們間隔的方法。于是我放棄用m.drawparallels和m.drawmeridians畫ticklabel,我決定用matplotlib的方法來畫。

 

下面兩段分別是畫x軸和y軸的ticklabel。

我們用xlabeltext來放著這些ticklabel,間隔的調節可以簡單粗暴地用換行換和空格符來處理(我相信matplotlib應該有方法調節間隔的,但我懶)

因為我們的ticklabel是經緯度,所以要用if來判斷一下NSEW。

最後用plt.xticks()來把ticklabel插入圖中。

##--xticklabel--##
xlabellon=np.arange(-180,180.1,45)
xlabeltext=[]
for i in xlabellon:
if i<0:
xlabeltext.append('\n%d$^\circ$W'%(i*-1))
elif i==0:
xlabeltext.append('\n0$^\circ$')
else:
xlabeltext.append('\n%d$^\circ$E'%i)
plt.xticks(xlabellon,xlabeltext,size=10,color='r')

##--yticklabel--##
ylabellat=np.arange(-90,90.1,45)
ylabeltext=[]
for i in ylabellat:
if i<0:
ylabeltext.append('%d$^\circ$S '%(i*-1))
elif i==0:
ylabeltext.append('0$^\circ$ ')
else:
ylabeltext.append('%d$^\circ$N '%i)
plt.yticks(ylabellat,ylabeltext,size=10,color='r')

 

最後效果如下面的圖,黑色的ticklabel是用m.drawparallels和m.drawmeridians畫的,紅色的ticklabel是用xticks和yticks畫的,可以比較一下。

 

 

import matplotlib
matplotlib.use('Agg')
from mpl_toolkits.basemap import Basemap, shiftgrid#,cm
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
import cmaps

plt.figure(figsize=(10,6.25),dpi=512)
ax=plt.subplot(1,1,1)
#m=Basemap(projection='robin',lon_0=0.,resolution='l')
m=Basemap(projection='cyl',llcrnrlat=-90.,urcrnrlat=90.,llcrnrlon=-180.,urcrnrlon=180.,resolution='l')
m.drawcoastlines(color='dimgray',linewidth=1.5,zorder=250)
m.drawparallels(np.arange(-90.,90.1,15.),dashes=[0.001,1000],labels=[1,0,0,0],size=10,linewidth=0.5,color='gray',zorder=450)
m.drawmeridians(np.arange(0.,360.,60.),dashes=[0.001,1000],labels=[0,0,0,1],size=10,linewidth=0.5,color='gray',zorder=450)
m.fillcontinents(color='0.85', lake_color=None, ax=None, alpha=None)


##--little line--##
import matplotlib.ticker as ticker
ax.xaxis.set_major_locator(ticker.MultipleLocator(45))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(10))
ax.yaxis.set_major_locator(ticker.MultipleLocator(60))
ax.yaxis.set_minor_locator(ticker.MultipleLocator(10))
ax.tick_params(which='major',width=2.00,length=10,direction='in',labelsize=10)
ax.tick_params(which='minor',width=1.00,length=5,direction='in',labelsize=10)

##--xticklabel--##
xlabellon=np.arange(-180,180.1,45)
xlabeltext=[]
for i in xlabellon:
if i<0:
xlabeltext.append('\n%d$^\circ$W'%(i*-1))
elif i==0:
xlabeltext.append('\n0$^\circ$')
else:
xlabeltext.append('\n%d$^\circ$E'%i)
plt.xticks(xlabellon,xlabeltext,size=10,color='r')

##--yticklabel--##
ylabellat=np.arange(-90,90.1,45)
ylabeltext=[]
for i in ylabellat:
if i<0:
ylabeltext.append('%d$^\circ$S '%(i*-1))
elif i==0:
ylabeltext.append('0$^\circ$ ')
else:
ylabeltext.append('%d$^\circ$N '%i)
plt.yticks(ylabellat,ylabeltext,size=10,color='r')



plt.savefig('empty_map.pdf')
plt.close()

 

posted @ 2022-07-27 10:19  A仔的黑眼圈  阅读(1368)  评论(0)    收藏  举报