用python的Basemap畫地圖時坐標軸的設置

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

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值