用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()