Basemap中的drawparallels参数问题

时间:2018-05-16 04:03:12

标签: python-3.x matplotlib-basemap

这似乎应该是一个简单的修复,但我无法让它工作。我希望在附加的图中显示40°N,但是将drawparallels中的labels参数设置为[1,0,1,1]并不是诀窍。这应该根据文档绘制它们与图的左侧,顶部和底部相交的平行标记。我还想在0°再次出现在右下角。我知道如何解决这两个问题?

from netCDF4 import Dataset as NetCDFFile
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
from mpl_toolkits.basemap import addcyclic
nc = NetCDFFile('C:/myfile.nc')
lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time = nc.variables['time'][:]
olr = nc.variables['olr'][:]
olr,lon = addcyclic(olr,lon)
map = Basemap(llcrnrlon=0.,llcrnrlat=-40.,urcrnrlon=360.,urcrnrlat=40.,resolution='l')
lons,lats = np.meshgrid(lon,lat)
x,y = map(lons,lats)
levels = np.arange(-19.5,20.0,0.5)
levels = levels[levels!=0]
ticks = np.arange(-20.0,20.0,4.0)
cs = map.contourf(x,y,olr[0],levels, cmap='bwr')
cbar = plt.colorbar(cs, orientation='horizontal', cmap='bwr', spacing='proportional', ticks=ticks)
cbar.set_label('Outgoing Longwave Radiation Anomalies $\mathregular{(W/m^2)}$')
map.drawcoastlines()
map.drawparallels(np.arange(-40,40,20),labels=[1,0,1,1], linewidth=0.5, fontsize=7)
map.drawmeridians(np.arange(0,360,40),labels=[1,1,0,1], linewidth=0.5, fontsize=7)

Plot showing issues with labels

1 个答案:

答案 0 :(得分:1)

问题的第一部分很简单。为了显示标签,您必须实际绘制平行线,但np.arange(-40,40,20)不包括40。因此,如果您将该语句更改为np.arange(-40,41,20),则会显示40N标签。

第二部分原则上应该以相同的方式解决,但是Basemap显然使用经度的模来计算标签的位置,因此在绘制经线时只使用np.arange(0,361,40)将导致两个{ {1}}标签相互叠加。但是,我们可以捕获0生成的标签并手动更改第二个drawmeridians标签的位置。标签存储在字典中,因此易于处理。为了计算最后一个标签的x位置,我计算第一个和第二个标签之间x位置的差异,将其乘以要绘制的子午线量(360/40)并添加第一个标签的x位置标签。

这里有完整的例子:

0

这里得到的情节:

result of the above code

希望这有帮助。