【问题标题】:Issue with drawparallels argument in Basemap底图中的 drawparallels 参数问题
【发布时间】:2018-05-16 15:51:11
【问题描述】:

这看起来应该很容易解决,但我无法让它工作。我希望 40°N 显示在附加图中,但是将 drawparallels 中的标签参数设置为 [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)

【问题讨论】:

    标签: python-3.x matplotlib-basemap


    【解决方案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()
    

    这里的结果图:

    希望这会有所帮助。

    【讨论】:

    • 谢谢!这解决了我的两个问题。你能告诉我为什么 np.arange(-40,40,20) 捕获 -40 而不是 40?
    • numpy.arange与标准range的工作方式基本相同:如果传递三个值,第一个是起始值,中间是终止值,最后一个值是增量。 arange 通过将增量值添加到原始起始值来生成值,只要结果数字小于 停止值。它可能需要一点时间来适应,但这就是它的定义方式。
    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多