python 底图:如何删除实际的纬度/经度线,同时保持轴上的刻度

vktxenjb  于 2023-04-28  发布在  Python
关注(0)|答案(4)|浏览(218)

我通过底图绘制了一张Map,如下所示:

plt.figure(figsize=(7,6))
m = Basemap(projection='cyl',llcrnrlat=40.125,urcrnrlat=44.625,\
        llcrnrlon=-71.875,urcrnrlon=-66.375,resolution='h')
m.drawparallels(np.arange(int(40.125),int(44.625),1),labels=[1,0,0,0])
m.drawmeridians(np.arange(int(-71.875),int(-66.375),1),labels=[0,0,0,1])
m.drawcoastlines()
m.fillcontinents(color='grey')
m.drawmapboundary()

图片如下:

如何删除实际的纬度/经度线,同时保持轴上的刻度?

iklwldmw

iklwldmw1#

这可以通过将linewidth参数设置为零轻松实现

m.drawparallels(np.arange(int(40.125),int(44.625),1),labels=[1,0,0,0], linewidth=0.0)
m.drawmeridians(np.arange(int(-71.875),int(-66.375),1),labels=[0,0,0,1], linewidth=0.0)

wmtdaxz3

wmtdaxz32#

basemap中,您可以设置suppress_ticks=False,并获得没有线条的刻度。

bjp0bcyl

bjp0bcyl3#

我发现底图刻度设置非常混乱。
下图显示了8种不同的设置。一些符号:

  • ST=Tsuppress_ticks=True
  • ST=Fsuppress_ticks=False
  • DP-DRdrawparallels()drawmeridians()
  • DP-DR(LW=0)drawparallels(...,linewidth=0)drawmeridians(...,linewidth=0)
  • mill:米勒Map投影。

解释顶部面板中的结果:

  • (a):这与OP的数字相同,即即使用suppress_ticks=True(默认值)和drawparallels()以及drawmeridians()
  • (B):@Greg建议的解决方案,将linewidth=0设置为drawparallels()drawmeridians()删除网格线,但不添加刻度。请注意,问题的标题是“如何删除实际的纬度/经度线,同时保持刻度在轴上”。
  • (c):@Janusz建议的解决方案。请注意,单独设置suppress_ticks=False不会删除网格线,而是添加了一组额外的刻度线。这就是为什么suppress_ticks默认为True
  • (d):合并(b)和(c)。linewidth=0实际上是删除网格线。同样,suppress_ticks=False引入了额外的刻度,它们与drawparallels()drawmeridians()添加的刻度重叠。

第二组:

  • (e):如果我们不使用drawparallels()drawmeridians(),让它自动添加刻度,会怎么样?第一个缺点是你不能控制要添加的滴答声。另一个是刻度标签的格式没有W/EN/S符号(如果您将labelstyle='+/-'添加到drawparallels()drawmeridians(),标签将使用+ 41^{\circ})。还有一个很大的缺点,如(f)所示。
  • (f):这是使用millMap投影而不是cyl。请注意,自动标注使用米作为单位,而不是纬度/经度。不好(至少在这种情况下)。
  • (g):这是试图通过手动设置刻度来添加刻度标记,通过ax.set_xticks(lon_ticks)ax.set_yticks(lat_ticks)。将添加刻度,但标签重叠。
  • (h):这是我再次使用mill投影提出的解决方案:
m = Basemap(projection='mill',llcrnrlat=40.125,urcrnrlat=44.625,\
        llcrnrlon=-71.875,urcrnrlon=-66.375,resolution='l',
        ax=ax8, fix_aspect=False,
        suppress_ticks=True)

m.drawcoastlines()

lat_ticks=np.arange(np.ceil(40.125),int(44.625),1)
lon_ticks=np.arange(np.ceil(-71.875),int(-66.375),1)

# convert from degree to map projection
lon_ticks_proj, _=m(lon_ticks, np.zeros(len(lon_ticks)))
_, lat_ticks_proj=m(np.zeros(len(lat_ticks)), lat_ticks)
# manually add ticks
ax8.set_xticks(lon_ticks_proj)
ax8.set_yticks(lat_ticks_proj)
ax8.tick_params(axis='both',which='major')
# add ticks to the opposite side as well
ax8.xaxis.set_ticks_position('both')
ax8.yaxis.set_ticks_position('both')
# remove the tick labels
ax8.xaxis.set_ticklabels([])
ax8.yaxis.set_ticklabels([])

m.drawparallels(lat_ticks,labels=[1,0,0,0],linewidth=0,
        xoffset=0.03*abs(m.xmax-m.xmin)) # need to enlarge the offset a bit
m.drawmeridians(lon_ticks,labels=[0,0,0,1],linewidth=0,
        yoffset=0.03*abs(m.ymax-m.ymin)) # need to enlarge the offset a bit

最后,创建图形的脚本:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

def getBM(ax, suppress_ticks, projection='cyl'):
    m = Basemap(projection=projection,llcrnrlat=40.125,urcrnrlat=44.625,\
            llcrnrlon=-71.875,urcrnrlon=-66.375,resolution='l',
            ax=ax, fix_aspect=False,
            suppress_ticks=suppress_ticks)

    m.drawcoastlines()

    return m

lat_ticks=np.arange(np.ceil(40.125),int(44.625),1)
lon_ticks=np.arange(np.ceil(-71.875),int(-66.375),1)

figure=plt.figure(figsize=(14,7),dpi=100)
nrows=2; ncols=4

#------------------------s1------------------------
ax1=figure.add_subplot(nrows,ncols,1)
m = getBM(ax1, True)

m.drawparallels(lat_ticks,labels=[1,0,0,0])
m.drawmeridians(lon_ticks,labels=[0,0,0,1])
ax1.set_title('(a) ST=T, DP-DR')

#------------------------s2------------------------
ax2=figure.add_subplot(nrows,ncols,2)
m = getBM(ax2, True)

m.drawparallels(lat_ticks,labels=[1,0,0,0],linewidth=0)
m.drawmeridians(lon_ticks,labels=[0,0,0,1],linewidth=0)
ax2.set_title('(b) ST=T, DP-DR(LW=0)')

#------------------------s3------------------------
ax3=figure.add_subplot(nrows,ncols,3)
m = getBM(ax3, False)

m.drawparallels(lat_ticks,labels=[1,0,0,0])
m.drawmeridians(lon_ticks,labels=[0,0,0,1])
ax3.set_title('(c) ST=F, DP-DR')

#------------------------s4------------------------
ax4=figure.add_subplot(nrows,ncols,4)
m = getBM(ax4, False)

m.drawparallels(lat_ticks,labels=[1,0,0,0],linewidth=0)
m.drawmeridians(lon_ticks,labels=[0,0,0,1],linewidth=0)
ax4.set_title('(d) ST=F, DP-DR(LW=0)')

#------------------------s5------------------------
ax5=figure.add_subplot(nrows,ncols,5)
m = getBM(ax5, False)

ax5.set_title('(e) ST=F')

#------------------------s6------------------------
ax6=figure.add_subplot(nrows,ncols,6)
m = getBM(ax6, False, projection='mill')

ax6.set_title('(f) ST=F, mill')

#------------------------s7------------------------
ax7=figure.add_subplot(nrows,ncols,7)
m = getBM(ax7, True)

ax7.set_xticks(lon_ticks)
ax7.set_yticks(lat_ticks)
m.drawparallels(lat_ticks,labels=[1,0,0,0],linewidth=0)
m.drawmeridians(lon_ticks,labels=[0,0,0,1],linewidth=0)
ax7.set_title('(g) ST=T, DP-DR(LW=0), manual tick')

#------------------------s8------------------------
ax8=figure.add_subplot(nrows,ncols,8)
m = getBM(ax8, True, projection='mill')

# convert from degree to map projection
lon_ticks_proj, _=m(lon_ticks, np.zeros(len(lon_ticks)))
_, lat_ticks_proj=m(np.zeros(len(lat_ticks)), lat_ticks)
# manually add ticks
ax8.set_xticks(lon_ticks_proj)
ax8.set_yticks(lat_ticks_proj)
ax8.tick_params(axis='both',which='major')
# add ticks to the opposite side as well
ax8.xaxis.set_ticks_position('both')
ax8.yaxis.set_ticks_position('both')
# remove the tick labels
ax8.xaxis.set_ticklabels([])
ax8.yaxis.set_ticklabels([])

m.drawparallels(lat_ticks,labels=[1,0,0,0],linewidth=0,
        xoffset=0.03*abs(m.xmax-m.xmin)) # need to enlarge the offset a bit
m.drawmeridians(lon_ticks,labels=[0,0,0,1],linewidth=0,
        yoffset=0.03*abs(m.ymax-m.ymin)) # need to enlarge the offset a bit
ax8.set_title('(g) ST=T, DP-DR(LW=0), manual tick*')

figure.tight_layout()
figure.show()

更新:我在使用drawparallels(..., linewidth=0)drawmeridians(..., linewidth=0)时,保存的PDF文件出现了一些问题。更多细节请参见https://github.com/matplotlib/basemap/issues/493

如果您遇到类似的问题,请考虑使用drawparallels(..., zorder=-2)

tvmytwxo

tvmytwxo4#

您可以删除网格线,同时保留标签和刻度线,通过使用dashes=[dash_length,dash_spacing]选项,这实际上是用于设置破折号长度和间距。将间距值设置为大于体形大小的值,如下所示。

m.drawparallels(np.arange(0,50,5),labels=[1,0,0,0],linewidth=0.9,dashes=[4,9900])
m.drawmeridians(np.arange(50,100,5),labels=[0,0,0,1],linewidth=0.9,dashes=[4,9900])

Example figure with ticks and labels

相关问题