子图之间的箭头

2023-12-10

我决定玩玩this示例代码一点。我能够弄清楚如何在两个子图之间绘制一条直线,即使该线位于其中一个子图的边界之外。

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

fig = plt.figure(figsize=(10, 5))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
axs = [ax1, ax2]

# Fixing random state for reproducibility
np.random.seed(19680801)

# generate some random test data
all_data = [np.random.normal(0, std, 100) for std in range(6, 10)]

# plot violin plot
axs[0].violinplot(all_data,
                  showmeans=False,
                  showmedians=True)
axs[0].set_title('Violin plot')

# plot box plot
axs[1].boxplot(all_data)
axs[1].set_title('Box plot')

# adding horizontal grid lines
for ax in axs:
    ax.yaxis.grid(True)
    ax.set_xticks([y + 1 for y in range(len(all_data))])
    ax.set_xlabel('Four separate samples')
    ax.set_ylabel('Observed values')

for tick in ax.xaxis.get_major_ticks():
    tick.label.set_fontsize(20)
plt.setp(axs[0], xticklabels=['x1', 'x2', 'x3', 'x4'])

transFigure = fig.transFigure.inverted()
coord1 = transFigure.transform(ax1.transData.transform([5,10]))
coord2 = transFigure.transform(ax2.transData.transform([2,-10]))
line = mpl.lines.Line2D((coord1[0],coord2[0]),(coord1[1],coord2[1]),
                        c='k', lw=5, transform=fig.transFigure)
fig.lines.append(line)

是的,添加的线很丑,但我只是想让它发挥作用。

然而,我真正想做的是在子图之间制作一个箭头,如果不临时调整我自己的箭头尾部,我无法弄清楚如何做。有没有一种方法可以使用matplotlib.pyplot.arrow class?


我还想在两个子图之间画一个箭头,但我什至不知道从哪里开始!然而,原始问题中子图示例之间的界限给了我足够的线索来开始......

首先,我将原始问题中的代码简化为最小的工作示例:

from matplotlib import lines, pyplot as plt

fig = plt.figure()

# First subplot
ax1 = fig.add_subplot(121)
plt.plot([0, 1], [0, 1])

# Second subplot
ax2 = fig.add_subplot(122)
plt.plot([0, 1], [0, 1])

# Add line from one subplot to the other
xyA = [0.5, 1.0]
ax1.plot(*xyA, "o")
xyB = [0.75, 0.25]
ax2.plot(*xyB, "o")
transFigure = fig.transFigure.inverted()
coord1 = transFigure.transform(ax1.transData.transform(xyA))
coord2 = transFigure.transform(ax2.transData.transform(xyB))
line = lines.Line2D(
    (coord1[0], coord2[0]),  # xdata
    (coord1[1], coord2[1]),  # ydata
    transform=fig.transFigure,
    color="black",
)
fig.lines.append(line)

# Show figure
plt.show()

这会产生以下输出:

Line between subplots

然后,使用这篇博文, I thought答案是创建一个matplotlib.patches.FancyArrowPatch并将其附加到fig.patches(而不是创建一个matplotlib.lines.Line2D并将其附加到fig.lines)。咨询后matplotlib.patches.FancyArrowPatch文档,加上一些试验和错误,我想出了一些可行的东西在 matplotlib 3.1.2 中:

from matplotlib import patches, pyplot as plt

fig = plt.figure()

# First subplot
ax1 = fig.add_subplot(121)
plt.plot([0, 1], [0, 1])

# Second subplot
ax2 = fig.add_subplot(122)
plt.plot([0, 1], [0, 1])

# Add line from one subplot to the other
xyA = [0.5, 1.0]
ax1.plot(*xyA, "o")
xyB = [0.75, 0.25]
ax2.plot(*xyB, "o")
transFigure = fig.transFigure.inverted()
coord1 = transFigure.transform(ax1.transData.transform(xyA))
coord2 = transFigure.transform(ax2.transData.transform(xyB))
arrow = patches.FancyArrowPatch(
    coord1,  # posA
    coord2,  # posB
    shrinkA=0,  # so tail is exactly on posA (default shrink is 2)
    shrinkB=0,  # so head is exactly on posB (default shrink is 2)
    transform=fig.transFigure,
    color="black",
    arrowstyle="-|>",  # "normal" arrow
    mutation_scale=30,  # controls arrow head size
    linewidth=3,
)
fig.patches.append(arrow)

# Show figure
plt.show()

但是,根据下面的评论,这不适用于matplotlib 3.4.2,你在哪里得到这个:

Arrow between subplots - incorrect

请注意,箭头的末端没有与目标点(橙色圆圈)对齐,而它们应该对齐。

This matplotlib版本更改也会导致原始行示例以同样的方式失败。

不过,还有一个更好的补丁!使用ConnectionPatch (docs),它是一个子类FancyArrowPatch,而不是使用FancyArrowPatch直接作为ConnectionPatch是专门为此用例设计的,可以更正确地处理转换,如下所示matplotlib文档示例:

fig = plt.figure()

# First subplot
ax1 = fig.add_subplot(121)
plt.plot([0, 1], [0, 1]) 

# Second subplot
ax2 = fig.add_subplot(122)
plt.plot([0, 1], [0, 1]) 

# Add line from one subplot to the other
xyA = [0.5, 1.0]
ax1.plot(*xyA, "o")
xyB = [0.75, 0.25]
ax2.plot(*xyB, "o")
# ConnectionPatch handles the transform internally so no need to get fig.transFigure
arrow = patches.ConnectionPatch(
    xyA,
    xyB,
    coordsA=ax1.transData,
    coordsB=ax2.transData,
    # Default shrink parameter is 0 so can be omitted
    color="black",
    arrowstyle="-|>",  # "normal" arrow
    mutation_scale=30,  # controls arrow head size
    linewidth=3,
)
fig.patches.append(arrow)

# Show figure
plt.show()

这会产生正确的输出matplotlib 3.1.2 and matplotlib 3.4.2,看起来像这样:

enter image description here

要绘制一条正确定位的线连接两个子图matplotlib 3.4.2, use a ConnectionPatch如上所述,但与arrowstyle="-"(即没有箭头,所以只是一条线)。

注意:您不能使用:

  • plt.arrow因为它会自动添加到当前轴,所以只出现在一个子图中

  • matplotlib.patches.Arrow当轴图变换使箭头倾斜时

  • matplotlib.patches.FancyArrow因为这也会导致箭头倾斜

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

子图之间的箭头 的相关文章

  • 熊猫按 n 最大总和分组

    我正在尝试使用groupby nlargest and sum在 Pandas 中一起运行 但在运行时遇到困难 State County Population Alabama a 100 Alabama b 50 Alabama c 40
  • Flask-SocketIO redis 订阅

    我在用着https github com miguelgrinberg Flask SocketIO https github com miguelgrinberg Flask SocketIO实现 WebSocket 服务器 我需要从另一
  • 从 torch.autograd.gradcheck 导入 zero_gradients

    我想复制代码here https github com LTS4 DeepFool blob master Python deepfool py 并且我在 Google Colab 中运行时收到以下错误 ImportError 无法导入名称
  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • 使用 Boto3 超时的 AWS Lambda 函数

    我已经解决了我自己的问题 但无论如何我都会发布它 希望能节省其他人几个小时 我在 AWS 上有一个无服务器项目 使用 Python 将记录插入到 kinesis 队列中 但是 当我使用 boto3 client kinesis 或 put
  • 使用 Python 和 lmfit 拟合复杂模型?

    我想适合椭偏仪 http en wikipedia org wiki Ellipsometry使用 LMFit 将数据转换为复杂模型 两个测量参数 psi and delta 是复杂函数中的变量rho 我可以尝试将问题分离为实部和虚部共享参
  • 如何找到多个 pandas 数据框中一对列与任意顺序对的交集?

    我有多个 pandas 数据框 为了简单起见 假设我有三个 gt gt df1 col1 col2 id1 A B id2 C D id3 B A id4 E F gt gt df2 col1 col2 id1 B A id2 D C id
  • NSUserNotificationCenter.defaultUserNotificationCenter() 使用 PyInstaller 返回 None

    我正在尝试将通知发送到通知中心 Mac OSX 我正在使用 PyObjC 绑定来使用我们的 python 应用程序中的 cocoa api 我正在使用以下代码片段 import Foundation import objc NSUserNo
  • 为什么需要设置WORKON_HOME环境变量?

    我已经有一段时间没有使用 python 虚拟环境了 但我也安装了虚拟环境包装器 我的问题是 在文档页面中它说要这样做 export WORKON HOME Envs mkdir p WORKON HOME source usr local
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • multiprocessing.Queue 中的 ctx 参数

    我正在尝试使用 multiprocessing Queue 模块中的队列 实施 https docs python org 3 4 library multiprocessing html exchang objects Between p
  • 使用会话在 Django 中将文件从一个视图传递到另一个视图

    我当前的工作项目要求我允许用户上传各种格式的文件 目前仅处理 CSV 格式 然后使用包含的数据来绘制图表Pandas http pandas pydata org 图书馆 我决定将图形渲染到模板的最简单方法是为图形创建特定视图 然后将图像从
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 如何将两列 pandas Dataframe 移动并堆叠为一列?

    我有一个下面提到的数据框 ETHNIC SEX USUBJID 0 HISPANIC OR LATINO F 16 1 HISPANIC OR LATINO M 8 2 HISPANIC OR LATINO Total 24 3 NOT H
  • SQLAlchemy 与 count、group_by 和 order_by 使用 ORM

    我有几个函数需要使用 count group by 和 order by 进行一对多连接 我使用 sqlalchemy select 函数生成一个查询 该查询将返回一组 id 然后我对其进行迭代以对各个记录执行 ORM 选择 我想知道是否有
  • PyQt5按钮lambda变量变成布尔值[重复]

    这个问题在这里已经有答案了 当我运行下面的代码时 它显示如下 为什么 x 不是 x 而是变成布尔值 这种情况仅发生在传递到用 lambda 调用的函数中的第一个参数上 错误的 y home me model some file from P
  • 超过两个点的Python相对导入

    是否可以使用路径中包含两个以上点的模块引用 就像这个例子一样 Project structure sound init py codecs init py echo init py nix init py way1 py way2 py w

随机推荐

  • 将 .org 指令与 .data 部分中的数据一起使用:与 ld 相关

    在我努力了解如何使用 GNU binutils 来构建一个简单的引导加载程序时 使用gas我遇到过这样的问题 如何告诉链接器将数据放置在使用 org 推进位置计数器的文件中 同时将文件大小保持在 512 字节 我似乎找不到办法做到这一点 尝
  • 创建 Gmail 共享链接

    我想在我的单页 Web 应用程序上放置一个按钮 允许用户通过 Gmail 发送链接 我发现有些网站 例如 addthis com 提供了这样的按钮 但是该按钮自动使用网址栏中的链接 由于我有一个单页 Web 应用程序 因此网址栏中的链接将始
  • 嵌入数组中嵌入文档中的项目字段

    我有以下查询 cursor self postCol aggregate graphLookup from pCol startWith parent connectFromField parent connectToField id as
  • Java 中的散列——结构和访问时间

    我正在寻找两个不同但相关的论点的验证 上述论点 A 及以下 B Q 中的第一行行注释 A 道路HashMap的结构是 a HashMap是一张普通的桌子 这就是直接内存访问 DMA 背后的整个想法HashMap 或一般的散列 首先 是将这种
  • 微软团队机器人自适应卡片轮播删除卡片

    我正在将 Microsoft 团队机器人与 Node js 一起使用 我正在渲染自适应卡的轮播 并在每张卡上执行操作 我的要求是删除单击该操作的单个卡片 是否可以 当前代码如下所示 我尝试过删除活动 但这会删除整个轮播 const Turn
  • 使用我的数据库中的数据计算年龄

    这是我当前正在使用的代码 但它不起作用 Geboortedatum 在荷兰语中是出生日的意思 mysql connect xxx xxx xxx mysql select db xxx result mysql query select G
  • 如何从 Facebook Graph API 获得响应能力?

    我可以从 Facebook Graph API 中提取一个指标来告诉我其中一个 两个吗Response Rate and or Average Response Time从页面 我将附上我所指内容的屏幕截图 当我进入 设置 gt 见解 gt
  • 无法在 AutoMapper 5 中从 ViewModel 映射到 ApplicationUser

    我有一个从 ApplicationUser 基类 ASP NET Identity 继承的 Student 类 它有一个名为 StudentViewModel 的 ViewModel 如下所示 实体类 public class Applic
  • Google Play 说我的 apk 使用两个本机平台(我的库),因此它支持 0 台设备

    当我在 Google Play 上发布 apk 时 它显示 支持 0 台设备 在 apk 描述的底部写着 本机平台 actionbarsherlock SherlockNavigatorDrawer 这些是我用于我的项目的库 它们不是 ja
  • 在 C++ 中模拟 lambda 的复制赋值运算符

    这个问题有两个部分 Firstly 有人可以解释 C 禁用 lambda 的复制赋值运算符背后的基本原理吗 如果您要允许复制构造函数 为什么不允许复制赋值运算符呢 Secondly 如何在不强迫人们编写 C 03 风格函子或使用 std f
  • MediaElement 和 RTSP

    MediaElement 支持 RTSP 吗 我有一个流正在运行 我可以通过以下方式使用 VLC 播放器使用该流 rtsp 192 168 1 17 554 stream 但是 当尝试使用 Windows Media Player 时 我无
  • 如何将一个巨大的矩阵逐行写入文件(fortran 90)

    我想将一个包含大量数据的矩阵逐行写入文件中 例如 我有一个 100 100 的矩阵 我想在文件中以 100 100 的形式保存它 但是 它不起作用 以下是我的代码和一些描述 N和M是数百左右的整数 RECL 是预期长度我设置了文件 但在这里
  • 如何通过行列切换进行矩阵转换?

    我有一个由元素组成的方阵 1 或 0 第 i 行切换会切换所有第 i 行元素 1 变为 0 反之亦然 并且第 j 列切换切换所有 第 j 列元素 我有另一个方阵 大小相似 我想将初始矩阵更改为 使用最少切换次数的最终矩阵 例如 0 0 1
  • 使用清单的 DLL 重定向

    我需要可靠地重定向应用程序对特定 DLL 的查找 使用 app exe local 方法不起作用 因为如果应用程序具有清单 嵌入或单独的文件 则本地文件将被忽略 因此 我尝试通过在清单中将 DLL 定义为私有程序集来进行 DLL 重定向 我
  • 线性时间排序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 给定 0 n 3 1 范围内的 n 个整数的输入集 提供线性时间排序算法 这是我周四测试的回顾 我不知道如何解决这个问题 也看看相关的排序 鸽巢排序 or 计数排序 也基数排序正如普
  • 从 VSTO PowerPoint 功能区调用 VBA AddIn 宏

    我在这个问题上被困了几个小时 我正在用 C 开发一个 PowerPoint 插件 我想使用另一个插件 PPAM 文件 中的宏 PPAM 文件已安装并启用 在应用程序参考中我发现我需要使用Application Run方法 但我无法让它工作
  • Selenium——如何等待页面完全加载[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Java 和 Selenium WebDriver 自动化一些测试用例 我有以下场景 有一个名为 产品 的页面 当我点击 查看详细信息 链接时 在 产品 页面中 会出现一个包含商品详细信息的弹出窗
  • 当组合根位于客户端时如何在 WCF 中注入依赖项

    在开始之前 我必须说 我可能咬得太多 但我正处于绝望的学习狂潮中 我需要很多帮助 我正在编写一个练习 从两本书中获取样本 1 Net 中的依赖注入 作者 Mark Seemann2 Brian Egan 和 Steve Valenzuela
  • React-router transitionTo 不是一个函数

    import React from react import Router Link Navigation from react router export default class ResourceCard extends React
  • 子图之间的箭头

    我决定玩玩this示例代码一点 我能够弄清楚如何在两个子图之间绘制一条直线 即使该线位于其中一个子图的边界之外 import matplotlib pyplot as plt import matplotlib as mpl import