Ultraplot地理坐标轴中的内嵌子图问题解析

Ultraplot地理坐标轴中的内嵌子图问题解析

问题背景

在使用Ultraplot进行地理数据可视化时,开发者遇到了一个关于内嵌子图(inset axes)的显示问题。当尝试在地理坐标轴(cyl投影)中添加内嵌子图时,发现内嵌子图的显示行为不符合预期。

问题现象

用户使用以下代码创建地理坐标轴并添加内嵌子图:

import ultraplot as uplt

fig = uplt.figure(span=False, share='all', journal='nat2')
ax = fig.subplot(proj="cyl")

ix = ax.inset(
    [126, 15.8, 8.8, 10],
    transform="data",
    zoom=True
)

fig.format(abc=True, abcloc="ul", lonlim=(73, 135.5), latlim=(17.8, 54.2),
           lonlines=20, latlines=10, lonlabels='both', latlabels='both')

期望内嵌子图能够:

  1. 显示在右下角位置
  2. 可以自由调整宽高比,而不是按主图比例缩小

但实际效果是内嵌子图始终按主图比例缩小显示,且有时完全不显示内嵌子图的定位标记。

问题原因分析

经过排查,发现这个问题与Matplotlib版本有关。在Matplotlib 3.9.4版本中确实存在此问题,表现为:

  1. 内嵌子图无法正确显示定位标记
  2. 内嵌子图的宽高比被强制与主图一致

解决方案

项目维护者提供了两种解决方案:

方案一:更新代码结构

fig, ax = uplt.subplots(proj="cyl")
ax.format(labels=True)

ix = ax.inset(
    [126, 15.8, 8.8, 10],
    transform="data",
    zoom=True,
)
ix.format(
    lonlim=(100, 110),
    latlim=(20, 30),
)

fig.format(
    abc=True,
    abcloc="ul",
    lonlim=(73, 135.5),
    latlim=(17.8, 54.2),
    lonlines=20,
    latlines=10,
    lonlabels="both",
    latlabels="both",
)
uplt.show(block=1)

这种结构在较新版本的Matplotlib中能够正常工作。

方案二:更新Ultraplot库

项目维护者已在主分支中修复了此问题。更新到最新版本的Ultraplot可以解决这个问题。

技术要点

  1. 地理坐标轴的特殊性:地理坐标轴(如cyl投影)与普通笛卡尔坐标轴不同,其内嵌子图处理需要考虑投影变换。

  2. 版本兼容性:不同版本的Matplotlib对地理坐标轴内嵌子图的支持程度不同,3.9.4版本存在已知问题。

  3. 代码结构影响:在某些情况下,创建图形和坐标轴的顺序以及格式设置的顺序会影响最终显示效果。

最佳实践建议

  1. 保持Matplotlib和Ultraplot为最新版本
  2. 使用推荐的代码结构创建图形和坐标轴
  3. 对于地理坐标轴的内嵌子图,明确设置其经纬度范围
  4. 在复杂可视化场景中,分步测试各组件功能

这个问题展示了地理数据可视化中的常见挑战,特别是在处理坐标轴嵌套和投影变换时。通过理解底层原理和保持库更新,可以有效解决这类问题。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值