如何获取网格线轴刻度位置?

时间:2020-01-23 21:04:47

标签: python-3.x matplotlib cartopy

我正在尝试从一个Cartopy地轴检索yaxis和xaxis刻度位置。

据我了解,常见的matplotlib的Axes具有内部方法:“ axes.get_xticks”和“ axes.get_yticks”。

但是,来自地轴的Cartopy网格线却没有。我该如何找回它们?

此外,当我尝试使用通用格式(即“ axes.get_yticks”)从地轴中检索刻度时,我最终得到了奇怪的坐标。

这里是一个例子。

import pandas as pd
pd.set_option('display.width', 50000)
pd.set_option('display.max_rows', 50000)
pd.set_option('display.max_columns', 5000)


import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature


from matplotlib.offsetbox import AnchoredText

def main(projection = ccrs.Mercator(), drawlicense=True):

    fig = plt.figure(figsize=(9,7))
    ax = plt.axes(projection=projection)


    # Put a background image on for nice sea rendering.
    ax.stock_img()

    # Create a feature for States/Admin 1 regions at 1:50m from Natural Earth
    states_provinces = cfeature.NaturalEarthFeature(
        category='cultural',
        name='admin_1_states_provinces_lines',
        scale='50m',
        facecolor='none')

    SOURCE = 'Natural Earth'
    LICENSE = 'public domain'

    ax.add_feature(cfeature.LAND)
    ax.add_feature(cfeature.COASTLINE)
    ax.add_feature(states_provinces, edgecolor='gray')

    # Add a text annotation for the license information to the
    # the bottom right corner.

    if drawlicense:

        text = AnchoredText(r'$\mathcircled{{c}}$ {}; license: {}'
                            ''.format(SOURCE, LICENSE),
                            loc='right',
                            bbox_transform=ax.transAxes,
                            bbox_to_anchor=(1.01, -0.02), 
                            prop={'size': 8}, 
                            frameon=False)

        ax.add_artist(text)

    plt.show()

    return ax

ax = main()

Gridliner = ax.gridlines(draw_labels=True)

在上述情况下,如果我尝试从地轴“ ax”中检索yticks,则会得到一系列奇怪的值,如下所示:


在:ax.get_yticks()

出: array([-20000000。,-15000000。,-10000000。,-5000000。,0., 5000000.,10000000.,15000000.,20000000。]]


请注意,尽管图形以及所选的Cartopy的投影状态的度数坐标值不是以度为单位。

因此,我在做什么错?如何获取地图的各个度坐标?

此致

1 个答案:

答案 0 :(得分:2)

cartopy轴实际上未显示正常的matplotlib刻度。相反,您可以使用ax.gridlines获得一组显示网格的线集合。返回的cartopy.mpl.gridliner.Gridliner可用于查询行的位置。

请注意,投影不一定在x和y中是可分离的,因此网格线可能是曲线。

在下面,我们将介绍这些行的第一点。

# create grid
gridliner = ax.gridlines(draw_labels=True)

# we need to draw the figure, such that the gridlines are populated
fig.canvas.draw()   

ysegs = gridliner.yline_artists[0].get_segments()
yticks = [yseg[0,1] for yseg in ysegs]

xsegs = gridliner.xline_artists[0].get_segments()
xticks = [xseg[0,0] for xseg in xsegs]

print(xticks)
print(yticks)

这将打印两个带有第一个网格线点坐标的列表:

[-180.0, -120.0, -60.0, 0.0, 60.0, 120.0]
[-80.0, -60.0, -40.0, -20.0, 0.0, 20.0, 40.0, 60.0, 80.0, 100.0]