Basemap中drawparallels参数出现问题。

3

这似乎应该是一个容易解决的问题,但我无法让它工作。我想在附加的图中显示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个回答

1
问题的第一部分很容易。为了让标签显示出来,您必须实际绘制平行线,但是np.arange(-40,40,20)不包括40。因此,如果您将该语句更改为np.arange(-40,41,20),您的40N标签将显示出来。
第二部分原则上应该可以用同样的方法解决,但是Basemap显然使用经度的模数来计算标签的位置,因此在绘制经线时仅使用np.arange(0,361,40)将导致两个0标签重叠在一起。但是,我们可以捕获drawmeridians生成的标签并手动更改第二个0标签的位置。标签存储在字典中,因此易于处理。为了计算最后一个标签的x位置,我计算第一个和第二个标签之间的x位置差异,将其乘以要绘制的子午线数(360/40),并添加第一个标签的x位置。
这是完整的示例:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap

map = Basemap(llcrnrlon=0.,llcrnrlat=-40.,urcrnrlon=360.,urcrnrlat=40.,resolution='l')

map.drawcoastlines()
yticks = map.drawparallels(
    np.arange(-40,41,20),labels=[1,0,1,1], linewidth=0.5, fontsize=7
)
xticks = map.drawmeridians(
    np.arange(0,361,40),labels=[1,1,0,1], linewidth=0.5, fontsize=7
)


first_pos = xticks[0][1][0].get_position()
second_pos = xticks[40][1][0].get_position()
last_x = first_pos[0]+(second_pos[0]-first_pos[0])*360/40
xticks[360][1][0].set_position((last_x,first_pos[1]))

plt.show()

这里是生成的图表:

result of the above code

希望这有所帮助。

谢谢!这解决了我的两个问题。你能告诉我为什么 np.arange(-40,40,20) 能捕获 -40,但不能捕获 40 吗? - bayouwxman
numpy.arange 的工作方式基本上与标准的 range 相同:如果传递三个值,则第一个值是起始值,中间值是停止值,最后一个值是增量。只要生成的数字比停止值arange 就会通过将增量值添加到原始起始值来产生值。这可能需要一点时间来适应,但这就是它的定义方式。 - Thomas Kühn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接