Как получить позиции галочки оси сетки? - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь получить позиции тиков яксис и ксакс из картографических геоосей.

Насколько я понимаю, у общих осей matplotlib есть внутренний метод: 'axes.get_xticks' и 'axes.get_yticks '.

Тем не менее, линия сетки картополя из геоосей не делает. Как я могу получить их?

Кроме того, когда я пытаюсь извлечь тики из геоосей, используя общий формат (то есть: "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)

В этом вышеупомянутом случае, если я попытаюсь извлечь утики из геоосей "топор", я получу массив странных значений как:


In: ax.get_yticks ()

Out: массив ([- 20000000., -15000000., -10000000., -5000000., 0., 5000000., 10000000., 15000000., 20000000.])


Обратите внимание, что значения не в градусах, хотя фигура, а также координаты градуса выбранных картографических состояний проекций.

Следовательно, что я делаю неправильно? Как я могу получить соответствующие градусные координаты карты?

С уважением,

1 Ответ

2 голосов
/ 24 января 2020

Оси картопов фактически не показывают нормальных тиков 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...