在 cartopy 轴之间绘制线

2023-12-25

我绘制了两组重叠的轴,一组是另一组的缩放版本。我想在缩放轴的角和它在较大轴上表示的矩形的角之间绘制线。然而,我画的线稍微偏离了位置。我试图将其浓缩为一个简单的示例:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt


# Create a large figure:
fig = plt.figure(figsize=(10, 10))

# Add an axes set and draw coastlines:
ax1 = plt.axes([0.01, 0.49, 0.8, 0.5], projection=ccrs.PlateCarree())
ax1.set_global()
ax1.coastlines()

# Add a second axes set (overlaps first) and draw coastlines:
ax2 = plt.axes([0.45, 0.35, 0.4, 0.3], projection=ccrs.PlateCarree())
ax2.set_extent([-44, 45, -15, 45], crs=ccrs.PlateCarree())
ax2.coastlines()

# Draw the rectangular extent of the second plot on the first:
x = [-44, 45, 45, -44, -44]
y = [-15, -15, 45, 45, -15]
ax1.fill(x, y, transform=ccrs.PlateCarree(), color='#0323E4', alpha=0.5)
ax1.plot(x, y, transform=ccrs.PlateCarree(), marker='o')

# Now try and draw a line from the bottom left corner of the second axes set
# to the bottom left corner of the extent rectangle in the first plot:
transFigure = fig.transFigure.inverted()
coord1 = transFigure.transform(ax2.transAxes.transform([0, 0]))
coord2 = transFigure.transform(ax1.transData.transform([-45, -15]))
line = plt.Line2D((coord1[0], coord2[0]), (coord1[1], coord2[1]), transform=fig.transFigure)
fig.lines.append(line)

plt.show()

With the following output: enter image description here

我认为这是因为我在调用时明确定义了轴的形状/方面plt.axes(),并且此形状与 cartopy 轴的形状不匹配,因为它们是使用旨在使地图看起来正确的纵横比绘制的。我可以在调用中调整轴的形状plt.axes()这样纵横比与地图的纵横比相匹配,并且线条绘制在我期望的位置,但这并不容易做到!有没有办法在坐标变换中解释这一点?


据我所知,这并不容易,因为您本质上是想在一个 CS 中定义一个点,在另一个 CS 中定义另一个点(BlishedGenericTransform 允许您在一个 CS 中定义 xs,在另一个 CS 中定义 ys,但不能定义单个点)。

因此,我所知道的唯一解决方案是构造一个需要一定数量的点进行变换的变换。我已经实现了一个 2 点变换类,它根据第一个变换来变换第一个点,并用另一个变换来变换第二点:

import matplotlib.transform as mtrans

class TwoPointTransformer(mtrans.Transform):
    is_affine = False
    has_inverse = False

    def __init__(self, first_point_transform, second_point_transform):
        self.first_point_transform = first_point_transform
        self.second_point_transform = second_point_transform
        return mtrans.Transform.__init__(self)

    def transform_non_affine(self, values):
        if values.shape != (2, 2):
            raise ValueError('The TwoPointTransformer can only handle '
                             'vectors of 2 points.')
        result = self.first_point_transform.transform_affine(values)
        second_values = self.second_point_transform.transform_affine(values)
        result[1, :] = second_values[1, :]
        return result

这样我就可以添加一条用我关心的坐标表示的线:

line = plt.Line2D(xdata=(-45, 0), ydata=(-15, 0),
                  transform=TwoPointTransformer(ax1.transData, ax2.transAxes))

注意:我认为 matplotlib 缓存具有非仿射变换的行存在问题,例如这样。当我们调整图形大小时,这个问题就会显现出来。因此,最简单的解决方案是添加以下行:

fig.canvas.mpl_connect('resize_event', lambda v: line.recache())

每次调整图形大小时都会重新计算线条。

这应该对你有用。

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 cartopy 轴之间绘制线 的相关文章

随机推荐

  • 线程安全是原子的还是非原子的?

    我搜索并发现不可变是线程安全的 而可变则不是 这可以 但我得到了误导性的笔记 博客 有关线程安全的原子与非原子的答案 请对答案进行解释 假设有一个名为 name 的原子字符串属性 如果您调用 self setName A 从线程 A 调用
  • 通过 iPhone 的 IP 地址进行地理定位

    我喜欢追踪用户 location 通过使用设备的 IP 地址 我已经寻找过一些 API 服务 例如 自由地理网 api petabyet com ip api com 但我不知道如何使用此服务来获取用户设备的位置 实际上我已经寻找了一些 S
  • HTML CSS自动调整高度

    我试图通过使用 CSS LESS 可视化来显示出港和入境航班 问题是 当出境航班比入境航班有更多的机场变更时 线路将保持在第一个航班的水平 我希望根据最长的路线动态调整线路高度 您能帮我弄清楚如何达到所需的结果吗 UPDATE 准备好了Pl
  • 如何创建可重定位的应用程序

    希望可以有人帮帮我 我有一些用 python 编写的东西 这使用了很多库 因此 我使用 virtualenv 创建了一个虚拟环境 并复制了该环境中需要的每个文件 然后我使用 Platypus 创建了一个 app 当然 该应用程序无法正常工作
  • 网络浏览器搜索是如何实现的?

    我想在桌面应用程序中实现java搜索和突出显示multiple中的短语html文件 就像在网络浏览器中完成的那样 所以html 标签 内 lt and gt 被忽略但有些标签像 b 没有被忽视 搜索示例时each table在文本中 eac
  • 引用 unique_ptr 的向量

    我有一个收藏unique ptrs 在这里 我想取出其中一些并将它们返回给调用者 调用者只需要读取内容 所以我想使用常量引用 但我不知道如何做到这一点unique ptrs 这是我用来使用原始指针执行此操作的一些代码 class entry
  • 从用户处获取字符输入时出现 IndexOutOfBoundsException

    在第15行ch s1 charAt 0 为什么 ch 没有得到 s1 的第 0 个字 即运算符 我尝试过不使用 try catch 方法 但错误与异常有关 现在没有例外 没有错误 但程序不要求操作员并在输入后直接 第一个和第二个值 它显示异
  • PostgreSQL 将列从 inet 转换为文本

    我想更改列的类型inet to text 所以 我执行 ALTER TABLE table ALTER COLUMN col TYPE text 但后来我发现所有值都添加了掩码 例如 192 168 100 141 gt 192 168 1
  • GCM BroadcastReceiver setResultCode 使用

    我正在使用 Android 开发人员提供的 GCM 示例 但无法理解其用途 setResultCode Activity Result OK 哪个组件接收此消息 谁在调用它并接收它 这是例子 public class GcmBroadcas
  • XAML Horizo​​ntalAlignment 属性没有执行我想要的操作

    xaml 代码 在网格内
  • 为遮罩层添加边框

    我正在尝试制作自定义形状UIButton使用遮罩层 我成功了 extension UIButton func mask withImage image UIImage frame CGRect let maskingLayer CAShap
  • Microsoft.Owin.StaticFiles 在控制台主机中工作,但我在文件请求的 IIS 中收到 404

    我在 Owin 管道中设置了 Microsoft Owin FileServer v2 1 0 并且使用 EnableDirectoryBrowsing true 设置 FileServerOptions 非常适合在我的控制台主机和 iis
  • 两个类互相引用

    假设有两个类 它们相互需要 容器 and item 班上容器创建类的实例item 类的每个实例item持有类的一个实例容器并且只需要调用该方法按项目调用的方法班级的容器 Class 容器需要查看类的所有字段item 问题是前向声明 我想在其
  • 为什么定义数组之外的第一个元素默认为零?

    我正在准备 C 入门课程的期末考试 我们的教授给了我们这个问题来练习 解释为什么代码会产生以下输出 120 200 16 0 using namespace std int main int x 120 200 16 for int i 0
  • 如何使 Bootstrap 工具提示在 SVG 上居中?

    我想将工具提示向右移动几个像素 因此箭头位于光标所在单元格的中心 当前 它位于 0 0 即左上角 这是我的代码 rect cell tooltip title hola placement top and an image 理想情况下 我想
  • 如何在异常发生之前检测到导致异常的情况?

    我没有运气这个问题 https stackoverflow com questions 553331 detecting unusable pooled sqlconnections所以我制作了这个尽可能简单的测试用例来演示这个问题 在下面
  • WPF 将 My.Settings 集合绑定到组合框项目

    我对 WPF 非常陌生 并且仍在尝试了解 XAML 中的绑定 我想用 my settings 中字符串集合的值填充组合框 我可以用这样的代码来做到这一点 Me ComboBox1 ItemsSource My Settings MyColl
  • 水晶报表将 DateTime 转换为字符串 为该函数提供了太多参数

    我在水晶报告中有一个简单的公式 如下所示 iif isnull employ createdDate ToText employ createdDate dd MMM yyyy The employ createdDate 格式如下 02
  • luis.ai 与 api.ai 与 wit.ai 之间的比较?

    有谁知道三者之间的具体区别和功能 或者作为开发人员是否有更多功能 更灵活地使用 wit ai https wit ai vs 对话流 https api ai vs luis ai https www luis ai wit ai vs a
  • 在 cartopy 轴之间绘制线

    我绘制了两组重叠的轴 一组是另一组的缩放版本 我想在缩放轴的角和它在较大轴上表示的矩形的角之间绘制线 然而 我画的线稍微偏离了位置 我试图将其浓缩为一个简单的示例 import cartopy crs as ccrs import matp