在 matplotlib 中绘制带中点箭头的圆形 fancyarrowpatch

2023-12-08

我一直在尝试突破 matplotlib 补丁的界限并指示它绘制圆形FancyArrowPatch中点有一个方向箭头。这在我尝试创建的网络表示中非常有用。

我使用 python 的编码时间还没有达到两位数,所以我不能说我对 matplotlib 的 patch.py​​ 有清楚的了解,但我已经将解决​​方案缩小到两种可能的策略:

  1. 聪明的,可能是Python式的方式:创建一个自定义arrowstyle进一步需要修改的类_get_arrow_wedge()函数包含中点坐标。目前这可能超出了我的可能性,或者
  2. 懒惰的方法:从引发的 FancyArrowPatch 中提取中点坐标并绘制所需的arrowstyle在这样的坐标上。

当然,到目前为止我选择的是偷懒的方式。我做了一些早期的实验,提取曲线的中点坐标FancyArrowPatch using get_path() and get_path_in_displaycoord(),但我似乎无法预测精确的中点坐标。一些帮助将不胜感激。

到目前为止我的摆弄:

import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch

n1 = (2,3)
n2 = (4,6)


# Try with multiple arc radius sizes, draw a separate plot each time
for rad in range(20):
    #setup figure
    figure = plt.figure()
    ax = plt.subplot(111)
    plt.annotate('rad:' + str(rad/25.),xy=(2,5))

    # create rounded fancyarrowpatch   
    t = FancyArrowPatch(posA=n1,posB=n2,
                        connectionstyle='arc3,rad=%s'%float(rad/25.),
                        arrowstyle='->',
                        shrinkA=0,
                        shrinkB=0,
                        mutation_scale=0.5)

    # extract vertices from get_path: points P#
    path = t.get_path().vertices.tolist()
    lab, px, py = ['P{0}'.format(i) for i in range(len(path))], [u[0] for u in path],[u[1] for u in path]
    for i in range(len(path)):
        plt.annotate(lab[i],xy=(px[i],py[i]))

    # extract vertices from get_path_in_displaycoord (but they are useless) : points G#
    newpath = t.get_path_in_displaycoord()
    a,b = newpath[0][0].vertices.tolist(), newpath[0][1].vertices.tolist()
    a.extend(b)
    glab, gx, gy = ['G{0}'.format(i) for i in range(len(a))], [u[0] for u in a],[u[1] for u in a]
    for i in range(len(a)):
        plt.annotate(glab[i],xy=(gx[i],gy[i]))    

    #point A: start
    x1, y1 = n1
    plt.annotate('A',xy=(x1,y1))    

    #point B:end
    x2, y2 = n2
    plt.annotate('B',xy=(x2,y2))

    #point M: the 'midpoint' as defined by class Arc3, specifically its connect() function
    x12, y12 = (x1 + x2) / 2., (y1 + y2) / 2.
    dx, dy = x2 - x1, y2 - y1
    cx, cy = x12 + (rad/100.) * dy, y12 - (rad/100.) * dx    
    plt.annotate('M',xy=(cx,cy))

    #point O : midpoint between M and P1, the second vertex from get_path   
    mx,my = (cx + px[1])/2., (cy + py[1])/2.
    plt.annotate('O',xy=(mx,my))

    ax.add_patch(t)
    plt.scatter([x1,cx,x2,mx,gx].extend(px),[y1,cy,y2,my,gy].extend(py))


plt.show()

objective

编辑:采纳@cphlewis建议:我尝试重建贝塞尔曲线:

def bezcurv(start,control,end,tau):
    ans = []
    for t in tau:
        B = [(1-t)**2 * start[i] + 2*(1-t)*t*end[i] + (t**2)*control[i] for i in range(len(start))]
        ans.append(tuple(B))
    return ans

因此,我将生成的线添加到原始图中:

tau = [time/100. for time in range(101)]
bezsim = bezcurv(n1,n2,(cx,cy),tau)
simx,simy = [b[0] for b in bezsim], [b[1] for b in bezsim]

The green line below is (should be?) the reconstructed bezier curve, though it's clearly not. attempt at bezier curve reconstruction


经过一番挣扎,我说服自己,要解决这个问题,我必须放弃FancyArrowPatch套件并从头开始创建一些东西。这是一个可行的解决方案,它远不能满足任何完美主义精神,但令我满意:

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import seed, randint

# Build function that connects two points with a curved line, 
# and an arrow on the middle of it

seed(1679)

narrow = 3
rad_one = 50
numpoints = 3

random_points = list(randint(1,20,[numpoints,4]))
rpoints = [[(a,b),(c,d)] for a,b,c,d in random_points]

def curvline(start,end,rad,t=100,arrows=1,push=0.8):
    #Compute midpoint
    rad = rad/100.    
    x1, y1 = start
    x2, y2 = end
    y12 = (y1 + y2) / 2
    dy = (y2 - y1)
    cy = y12 + (rad) * dy
    #Prepare line
    tau = np.linspace(0,1,t)
    xsupport = np.linspace(x1,x2,t)
    ysupport = [(1-i)**2 * y1 + 2*(1-i)*i*cy + (i**2)*y2 for i in tau]
    #Create arrow data    
    arset = list(np.linspace(0,1,arrows+2))
    c = zip([xsupport[int(t*a*push)] for a in arset[1:-1]],
                      [ysupport[int(t*a*push)] for a in arset[1:-1]])
    dt = zip([xsupport[int(t*a*push)+1]-xsupport[int(t*a*push)] for a in arset[1:-1]],
                      [ysupport[int(t*a*push)+1]-ysupport[int(t*a*push)] for a in arset[1:-1]])
    arrowpath = zip(c,dt)
    return xsupport, ysupport, arrowpath

def plotcurv(start,end,rad,t=100,arrows=1,arwidth=.25):
    x, y, c = curvline(start,end,rad,t,arrows)
    plt.plot(x,y,'k-')
    for d,dt in c:
        plt.arrow(d[0],d[1],dt[0],dt[1], shape='full', lw=0, 
                  length_includes_head=False, head_width=arwidth)
    return c

#Create figure
figure = plt.figure()
ax = plt.subplot(111)
for n1,n2 in rpoints:    
    #First line
    plotcurv(n1,n2,rad_one,200,narrow,0.5)
    #Second line
    plotcurv(n2,n1,rad_one,200,narrow,0.5)
ax.set_xlim(0,20)
ax.set_ylim(0,20)
plt.show

我用三个随机的点对其进行了测试,绘制了来回线。得出下图:

Lines and directional arrows

该功能允许用户设置多个所需的箭头,并将它们均匀地放置在绘制的贝塞尔曲线上,确保表示适当的方向。但是,由于贝塞尔曲线并不完全是“弧”,因此我试探性地推动箭头的起点,使它们看起来更居中。对此解决方案的任何改进将不胜感激。

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

在 matplotlib 中绘制带中点箭头的圆形 fancyarrowpatch 的相关文章

  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • python类型中的__flags__有什么用

    我最近阅读了pickle源代码 以下代码在copy reg让我很困惑 HEAPTYPE 1 lt lt 9 def reduce ex self proto assert proto lt 2 for base in self class
  • matplotlib get_color 用于子图

    我正在按照这里的教程进行操作 https matplotlib org gallery ticks and spines multiple yaxis with spines html https matplotlib org galler
  • Python绕相机轴旋转图像

    假设我有一个图像 是在对某些原始图像应用单应性变换 H 后获得的 未显示原始图像 将单应性 H 应用于原始图像的结果是该图像 我想围绕合适的轴 可能是相机所在的位置 如果有的话 将此图像旋转 30 度以获得此图像 如果我不知道相机参数 如何
  • 如何逐行替换(更新)文件中的文本

    我试图通过读取每一行 测试它 然后写入是否需要更新来替换文本文件中的文本 我不想保存为新文件 因为我的脚本已经先备份文件并对备份进行操作 这是我到目前为止所拥有的 我从 os walk 获取路径 并且保证 pathmatch var 正确返
  • Python中非常大的整数的math.pow是错误的[重复]

    这个问题在这里已经有答案了 我试图通过计算一个整数的非常大的幂来打印一个非常大的数字 尽管我的代码是正确的 但我没有观察到所需的输出 一般来说 Python解释器可以打印系统内存支持的非常大的整数 考虑到这个假设 下面是我正在运行的代码 a
  • 简单 CAE 的问题

    看起来简单的 CAE 不适用于 Carvana 数据集 我正在尝试对 Carvana 数据集进行简单的 CAE 你可以下载它here https www kaggle com c carvana image masking challeng
  • 如果工作表不存在,Pandas 将工作表附加到工作簿,否则覆盖工作表

    我正在使用 pandas 更新现有的 Excel 工作簿 当使用ExcelWriter对象 我可以覆盖工作表 如果存在 否则创建一个新工作表吗 我的代码附加了新工作表 但是当我尝试覆盖现有工作表时 它会附加一个名称略有不同的新工作表 例如
  • 如何在Python中重命名virtualenv?

    我拼错了名字virtualenv使用以下方法初始化它 virtualenv vnev 我实际上打算创建一个名为的环境venv 尝试重命名后vnev文件夹到venv 我发现这并没有提供太多帮助 激活环境的名称仍然重命名旧的vnev mv vn
  • 桨在移动时留下痕迹(Pygame Pong 游戏)[重复]

    这个问题在这里已经有答案了 我的游戏中的球拍有问题 每次我试图移动它时 桨都会留下一条 痕迹 我想这是因为我的代码没有删除旧位置的前一个桨 如果是的话怎么删除之前的呢 我应该使用blit Code import pygame sys ran
  • Matplotlib - 使用 plt.imshow() 时序列关闭

    我在 Jupyter 笔记本中编写了一个狗分类器 每次在图像中检测到狗时 它都应该显示该图像并打印一些描述该图像的文本 不知何故 无论我按什么顺序放置 图像总是在打印所有文本后显示plt imshow and print 有谁知道为什么会这
  • 并行磁盘 I/O

    我有几个想要阅读的日志文件 不失一般性 假设日志文件处理如下 def process infilepath answer 0 with open infilepath as infile for line in infile if line
  • Kivy错误(python 2.7):sdl2导入错误

    我尝试在我的 Python 2 7 项目 在 PyCharm Windows 10 环境中 上使用 kivy 但出现以下错误 如果有人可以帮助我吗 谢谢 PS 我多次尝试卸载 重新安装库等 并按照像这样的帖子上的建议进行操作 但它不起作用
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • Django - 从时间戳获取不同的日期

    我正在尝试按日期过滤用户 但直到我可以找到数据库中用户的第一个和最后一个日期为止 虽然我可以让我的脚本稍后过滤掉重复项 但我想从一开始就使用 Django 来完成此操作distinct因为它显着减少 我试过 User objects val
  • 如何使 cx-oracle 将查询结果绑定到字典而不是元组?

    这是我的代码 我想找到一种方法将查询结果作为字典列表而不是元组列表返回 看起来 cx oracle 通过部分文档讨论 绑定 来支持这一点 虽然我不知道它是如何工作的 def connect dsn cx Oracle makedsn hos
  • 按键合并的两个字典的值的并集

    我有两本词典 d1 a x y b k l d2 a m n c p r 如何合并这两个字典以获得这样的结果 d3 a x y m n b k l c p r 当字典的值是简单类型 如 int 或 str 时 这有效 d3 dict i a
  • Python,质数检查器[重复]

    这个问题在这里已经有答案了 你好 我正在创建一个函数来检查一个数字是否是素数 但它告诉我 9 是一个素数 def eprimo num if num lt 2 return False if num 2 return True else f
  • 在 python 中,VSCode 调试器不会单步执行外部代码。无法弄清楚如何编辑 launch.json 中的“justMyCode”

    我一直在提到https code visualstudio com docs python debugging justmycode https code visualstudio com docs python debugging jus
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添

随机推荐

  • EntityFramework Core 自动迁移

    有没有代码可以实现自动迁移Entity Framework core code first在 asp net core 项目中 我只是在 MVC4 5 中添加 Database SetInitializer new MigrateDatab
  • Python 向量化嵌套 for 循环

    我希望能够帮助您找到和理解一种 Pythonic 方法来优化嵌套 for 循环中的以下数组操作 def func a b radius Return 0 if a gt b otherwise return 1 if distance eu
  • 在 Laravel Post 中授权资源控制器不起作用?

    我创建了一个 ProductPolicy 其中有
  • PHP:将表单中的值插入 MySQL

    我创建了一个users表中mysql从终端 我正在尝试创建简单的任务 从表单插入值 这是我的dbConfig file 这是我的Index php
  • Android Telegram 应用程序 --> java.lang.UnsatisfiedLinkError: 未找到 void 的实现

    不幸的是 几周前 Stackoverflow 上删除了一个类似的问题 我必须提出一个新问题 我正在尝试通过源 为Android构建一个自己的Telegram应用程序https github com DrKLO Telegram 我无法让它工
  • 如何使用选项字典关闭 Swift 中的 Core Data Write-Ahead 日志记录?

    如何使用 Apple 新编程语言 Swift 关闭 Core Data 中的 SQLite 预写日志记录 WAL 在 ObjC 中 我曾经在选项字典中传入键值对 journal mode DELETE storeCoordinator ad
  • 稀疏签出后过滤 git 提交历史记录

    git repo 下有几十个文件夹 但我只与其中之一合作 所以 我不想知道其他文件夹下的项目发生了什么 我从远程签出了一个启用了稀疏签出的分支 现在我本地只有一个文件夹 但使用 gitk 时我仍然可以看到完整的提交历史记录 我在交互式变基期
  • 如何处理.NET Winforms中的堆叠控件?

    我有一个表单 它将多个面板控件堆叠在一起 每个控件都根据表单上的其他选定选项显示 隐藏 在表单设计器中管理起来确实很痛苦 因为面板的行为不像完整的 TabControl 但是 您似乎无法在没有选项卡的情况下使用 TabControl 处理这
  • 使用 PDFBox 拆分大型 Pdf 文件会得到大型结果文件

    我正在使用 pdfbox 处理一些大型 pdf 文件 高达 100MB 大约 2000 页 有些页面包含二维码 我想将这些文件分割成更小的文件 页面从一个二维码到下一个二维码 我得到了这个 但结果文件大小与源文件相同 我的意思是 如果我将一
  • 具有从 C# 到非托管驱动程序的嵌入式指针的编组结构

    我正在尝试使用 P Invoked DeviceIoControl 调用将 C NET Compact Framework 3 5 与 Windows CE 6 R2 流驱动程序连接起来 对于 IOCTL 代码之一 驱动程序需要一个 Dev
  • 当准备 segue 数组不包含数据时(使用 swift)

    根据按下的按钮 我想将单词列表附加到在开始时声明的变量 pickedList 当我准备继续时 它会覆盖已添加的内容 并且仅使用开始时添加的空数组 我可以在准备继续位中添加项目并将这些项目转移过来 但这不是我想要的 我对编程非常陌生 并且进行
  • JavaFx - 更新 GUI

    我想要的只是在程序运行时更新标签 我正在读取一些文件 我希望它显示正在读取的文件的名称 但是 它仅使用以下代码显示最后一个文件 基本上 GUI 在整个过程完成之前不会响应 static Text m status update new Te
  • 在 Windows 10 中启用 cURL

    我已经在笔记本电脑上设置了本地服务器 Windows 10 家庭单语言 64 位版本 1803 我已经下载并手动安装apache24 php7 MySQL php我的管理员 and 文字新闻通过遵循这个tutorial 我正在尝试启用 cU
  • 从mysql数据库提取数据时如何在mpdf中换行

    我正在使用 MPDF 从 mysql 数据库中存储的数据生成 pdf 文件 虽然我可以按预期提取和显示其他数据 但我无法显示多行文本 因为它们都在单行中 有人可以帮我解决这个问题吗 例如 我来自文本区域的数据在数据库中显示为 一 Two T
  • 加载和释放NSImage时内存持续增加

    我遇到一个问题 我的应用程序在连续加载图像文件时会大量消耗内存到 崩溃点 例如 考虑以下代码 该代码重复加载和释放 15MB JPEG 文件 用于测试目的的大文件大小 NSURL inputUrl NSURL URLWithString f
  • 在 JavaScript 中运行 PHP 代码?这个可以用吗?

    我不确定 PHP 行是否可以在 JavaScript 函数内运行 例如 我没有尝试过运行这个 但我不认为你可以像这样运行 PHP 有人可以帮忙吗 我可以在 javascript 函数中运行 PHP 脚本 而不通过 Ajax 调用外部 PHP
  • Angular 文件上传进度百分比[重复]

    这个问题在这里已经有答案了 在我用 Angular 4 开发的应用程序中 用户可以将多部分文件上传到服务器 文件很大 我需要向用户显示文件上传过程的当前进度及其百分比 我该怎么做 提前致谢 这适用于 Angular 9 和 10 note
  • 在 C# 中使用 OpenGL? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有免费的 C OpenGL 支持库吗 如果是 我应该使用哪一个 在哪里可以找到示例项目 C 是否提供 OpenGL 类 OpenTK是对 Tai A
  • 从服务器端动态检索 GridPanel 模型/存储/列

    我有一个 GridPanel 在 DB SP 返回表的列之后 必须动态创建其存储模型和列模型 我的问题是如何将值 字符串或 JSON 从服务器传递到 GridPanel Ext define Base GridPanel extend Ex
  • 在 matplotlib 中绘制带中点箭头的圆形 fancyarrowpatch

    我一直在尝试突破 matplotlib 补丁的界限并指示它绘制圆形FancyArrowPatch中点有一个方向箭头 这在我尝试创建的网络表示中非常有用 我使用 python 的编码时间还没有达到两位数 所以我不能说我对 matplotlib