使用cartopy和AxesGrid时如何获得“L”形标签

2024-03-28 21:22:06 发布

您现在位置:Python中文网/ 问答频道 /正文

(从this Github issue复制过来)

我正在尝试修改使用cartopy+AxesGrid的轴的标签,遵循cartopy docshere中显示的示例。但与示例不同的是,我只希望标签是“L”形的,即最左边的列上有垂直的标签,最下面的行上有水平的标签。你知道吗

当我编辑任何ax的水平标签时,该列中所有轴的水平标签都会随之更改。对于垂直标签和该行中的所有轴也是如此。(无论是否使用cartopy,AxesGrid都是如此,但在后一种情况下,我只需设置label\u mode='L',无需手动更改它们。)

我在this gist中创建了一个MWE,在这里复制:

import cartopy.crs as ccrs
from cartopy.mpl.geoaxes import GeoAxes
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import AxesGrid

fig = plt.figure()
projection = ccrs.PlateCarree()
axes_class = (GeoAxes,
              dict(map_projection=projection))

axgrid = AxesGrid(fig, 111, axes_class=axes_class,
                  nrows_ncols=(2, 2), 
                  axes_pad=0.3,
                  label_mode='')

for n, ax in enumerate(axgrid):
    ax.set_xticks(np.linspace(-180, 180, 5), crs=projection)
    ax.set_yticks(np.linspace(-90, 90, 5), crs=projection)

# Removing the xticklabels from the upper right corner panel
# also removes them from the lower right corner panel
axgrid[1].set_xticklabels([])

Tags: fromimportasnp水平标签axclass
1条回答
网友
1楼 · 发布于 2024-03-28 21:22:06

多亏了@spencerkclark,在this gist中提供了一个变通解决方案,并在此处复制。你知道吗

fig = plt.figure()
projection = ccrs.PlateCarree()
axes_class = (GeoAxes,
              dict(map_projection=projection))

axgrid = AxesGrid(fig, 111, axes_class=axes_class,
                  nrows_ncols=(2, 2), 
                  axes_pad=0.3,
                  label_mode='')

for n, ax in enumerate(axgrid):
    ax.set_xlim(-180, 180)
    ax.set_ylim(-90, 90)
    ax.set_xticks(np.linspace(-180, 180, 5), crs=projection)
    ax.set_yticks(np.linspace(-90, 90, 5), crs=projection)


# Make ticklabels on inner axes invisible
axes = np.reshape(axgrid, axgrid.get_geometry())
for ax in axes[:-1, :].flatten():
    ax.xaxis.set_tick_params(which='both', 
                             labelbottom=False, labeltop=False)

for ax in axes[:, 1:].flatten():
    ax.yaxis.set_tick_params(which='both', 
                             labelbottom=False, labeltop=False)

编辑:如果面板数量小于nrows*ncols,例如,如果是4x2网格,但只有7个面板,则此逻辑失败。以下工作也适用于这些情况:

def _hide_inner_ax_ticklabels(axgrid):
     """Produce 'L' shaped ticklabels: left row and bottom column only.

    Must do this manually when using axgrid + cartopy due to bug.
    See https://github.com/SciTools/cartopy/issues/939.
    """
    total_panels = axgrid._nrows * axgrid._ncols
    blank_panels = total_panels - axgrid.ngrids
    newgrid = np.concatenate([axgrid, [None]*blank_panels])
    axes = np.reshape(newgrid, axgrid.get_geometry())
    for ax in axes[:-1, :].flatten():
        try:
            ax.xaxis.set_tick_params(which='both', labelbottom=False, 
                                     labeltop=False)
        except AttributeError:
            pass

    for ax in axes[:, 1:].flatten():
        try:
            ax.yaxis.set_tick_params(which='both', labelbottom=False, 
                                     labeltop=False)
        except AttributeError:
            pass

相关问题 更多 >