以与轴的纵横比一致的物理单位重新缩放箭袋箭头

2024-04-07

过去几个小时我一直在尝试定制matplotlib.quiver没有太多运气。该文档非常混乱,我无法解析如何设置每个参数。在我的坐标轴中,一个垂直像素的物理距离比一个水平像素的物理距离小得多,并且我希望 quiver 将箭头自动缩放到此纵横比。我目前得到的是带有以下代码的水平箭头:

Tlevs = np.arange(-1.,8.5,.5) + 0.
yy, zz = np.meshgrid(ds.YC, ds.Z)

fig, ax = plt.subplots(figsize=(8,5))
fig.set_tight_layout(True)
im = ax.contourf(T_clim.YC, T_clim.Z, T_clim, levels=Tlevs)
ax.quiver(yy[::3,::10], zz[::3,::10], 
          vpFep_b[::3,::10], wpFep_b[::3,::10], 
          pivot='mid', angles='xy', units='xy')
ax.set_xlabel('Y [m]', fontsize=13)
ax.set_ylabel('Depth [m]', fontsize=13)
cbar = fig.colorbar(im, ax=ax)
cbar.set_label(r"[$^\circ$C]")

将箭袋选项设置为以下内容只会给出箭头应有的点:

ax.quiver(yy[::3,::10], zz[::3,::10], 
              vpFep_b[::3,::10], wpFep_b[::3,::10], 
              pivot='mid', angles='xy', scale_units='xy', scales=1.)

and:

ax.quiver(yy[::3,::10], zz[::3,::10], 
              vpFep_b[::3,::10], wpFep_b[::3,::10], 
              pivot='mid', angles='xy', scale_units='xy')

给出以下错误:

/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:666: RuntimeWarning: divide by zero encountered in double_scalars
  length = a * (widthu_per_lenu / (self.scale * self.width))
/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:666: RuntimeWarning: invalid value encountered in multiply
  length = a * (widthu_per_lenu / (self.scale * self.width))
/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:719: RuntimeWarning: invalid value encountered in less
  short = np.repeat(length < minsh, 8, axis=1)
/home/takaya/miniconda3/envs/uptodate/lib/python3.6/site-packages/matplotlib/quiver.py:733: RuntimeWarning: invalid value encountered in less
  tooshort = length < self.minlength

任何帮助,将不胜感激。谢谢!


The quiver文档 https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.quiver.html says:

要在 x-y 平面上绘制向量,其中 u 和 v 与 x 和 y 具有相同的单位,请使用angles='xy', scale_units='xy', scale=1

因此,使用这个论点你的问题将得到解决。那是因为关键字units影响箭头尺寸除了长度, and scale_units影响only长度。

Edit:

matplotlib 箭袋的参数行为示例

确实,文档并不完全清楚,并且有许多具有相似名称的参数,除此之外,这些参数是 quiver 所独有的。

下面有许多不同参数的行为示例,特别是该问题感兴趣的参数:angles, units and scale_units。每个示例都有一个可以通过单击展开的图像。

所有图的数据都是相同的,可以使用以下代码重现:

x = np.linspace(0,50,5)
y = np.linspace(-150,150,7)
X,Y = np.meshgrid(x,y)
U = 3.5*np.ones_like(X)
V = 3.5*np.ones_like(Y)

angles

文档中的条目是:

角度:[‘uv’| ‘xy’],数组,可选

确定箭头角度的方法。默认为“uv”。

‘uv’:箭头轴纵横比为 1,因此如果 U*==*V,则绘图上箭头的方向与水平轴逆时针方向成 45 度(向右为正)。

‘xy’:箭头从 (x,y) 指向 (x+u, y+v)。例如,使用它来绘制梯度场。

在我们的例子中,U 和 V 之间的比率为 1,因此在“uv”情况下箭头将指向 45 度,但是,在“xy”情况下,由于 y 轴和 x 轴的范围不同,因此箭头不会指向 45 度,以保留从 (x,y) 到 (x+u, y+v) 的位移。考虑这一点很重要,因为根据轴的纵横比,梯度 (u,v)=(1,1) 不会有 45 度角。

units

文档的入口是:

单位:[‘宽度’| ‘高度’| ‘点’| ‘英寸’| ‘x’| ‘y’| ‘xy’]

箭头尺寸(长度除外)以该单位的倍数测量。

‘width’或‘height’:轴的宽度或高度

‘dots’ 或 ‘inches’:像素或英寸,基于图形 dpi

‘x’、‘y’或‘xy’:分别为 X、Y 或数据单位

箭头的比例根据单位的不同而不同。对于“x”或“y”,箭头随着放大而变大;对于其他单位,箭头大小与缩放状态无关。对于“width”或“height”,当窗口大小调整时,箭头大小分别随着轴的宽度和高度而增加;对于“点”或“英寸”,调整大小不会改变箭头。

如上所述,该参数定义了测量除箭头长度之外的所有尺寸的单位。然而,参数宽度(这是最相关的,因为箭头头宽和头长等被定义为它的倍数)有一个默认值,这取决于使用的单位。

下面是不同单位的示例,将宽度固定为可比较的情况。参数点或英寸几乎是等效的,因此示例中仅考虑其中之一。因此,“宽度”和“高度”的宽度设置为 0.01,“点”的宽度设置为 3,“x”、“y”和“xy”的宽度设置为 2。根据后端的不同,不固定相同的宽度会产生不同的结果:即matplotlib 内联 https://i.stack.imgur.com/AvvIZ.png在 jupyter 中,在任何情况下都没有区别Qt5 https://i.stack.imgur.com/5In58.png有一些,但很难解释,因为宽度未知。

可以看出,由于绘图轴的宽度大于高度,因此将单位设置为“宽度”会比“长度”产生更粗的箭头,因为宽度相同。比较“x”、“y”和“xy”时也是如此,根据 x 轴测量的距离 1 远大于根据 y 轴测量的距离 1。

scale_units

文档中的条目是:

比例单位:[‘宽度’| ‘高度’| ‘点’| ‘英寸’| ‘x’| ‘y’| ‘xy’],无,可选

如果比例 kwarg 为 None,则为箭头长度单位。默认为“无”。

例如scale_units 为“英寸”,scale 为 2.0,且 (u,v) = (1,0),则矢量将为 0.5 英寸长。

如果scale_units是‘width’/‘height’,那么向量将是轴的宽度/高度的一半。

如果 scale_units 为“x”,则向量将为 0.5 个 x 轴单位。要在 x-y 平面上绘制向量,其中 u 和 v 具有与 x 和 y 相同的单位,请使用angle='xy'、scale_units='xy'、scale=1。

关于调整绘图大小时缩放的说明与单位相同。然而,“如果比例 kwarg 为 None”的陈述完全不清楚并导致错误。

如果scale为None,则箭头的长度将根据scale_units设置为默认值,以保持宽度和高度之间合理的比例并使箭头保持良好的形状(即合理的头部)。然后,在调整绘图大小之前,scale_units 不会被正确理解(由于缩放比例取决于scale_units)。

如果比例与“无”不同,则箭头长度不再设置为其默认值,它遵循文档中的示例。

下面的图比较了不同的scale_units值,其中scale=1,单位设置为其默认值“width”。

可以看出,“y”情况下,由于 U、V 向量之间的大小差异(约为 5)和 y 比例(在 -150 到 150 之间)之间的差异,使得箭头看起来像点,而在这种情况下“宽度”和“长度”的大小是绘图轴大小的 5 倍,使得箭头变得巨大。

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

以与轴的纵横比一致的物理单位重新缩放箭袋箭头 的相关文章

随机推荐

  • 将 STDIN 拆分为多个文件(如果可能的话压缩它们)

    我有一个程序 gawk 将数据流输出到它的STDOUT 处理的数据实际上有 10 GB 我不想将其保留在单个文件中 而是将其分成多个块 并可能在保存之前对每个文件应用一些额外的处理 如压缩 我的数据是一系列记录 我不想拆分将记录减半 每条记
  • 查找最小值之前的每列值的最大值

    考虑数组a a np array 5 4 4 5 2 2 6 1 3 7 我可以找到最小值在哪里 a argmin 0 array 2 3 如何找到索引 2 之前第 0 列值的最大值 第 1 列和索引 3 也是如此 更重要的是 它们在哪里
  • 为什么RecyclerView.OnScrollListener不是接口而是抽象类?

    实现无尽滚动模式RecyclerView我想创建一个像 public class EndlessScrollAdapter
  • Xamarin 和托管可扩展性框架 (MEF)

    我正在考虑一个新的移动 平板电脑应用程序 我想让用户开发自己的插件 想象一下在 Android 平板电脑上运行的收银台应用程序 连接到信用卡读卡器时 用户可以使用许多替代方案 Square https squareup com Sum Up
  • CSS 选择器获取 HTML 树中特定类的最深元素

    我的 HTML 中有一堆 DIV 元素 其中几个元素的 class 属性设置为 rowsLayout 其中一些 rowsLayout DIV 可以相互嵌套 我想定义一个 CSS 选择器 仅针对这些嵌套中最深的 DIV 也就是说 我don t
  • Android APK的静默安装

    我正在寻找一种方法来对我的应用程序进行编程以静默安装 APK 文件 我知道可以使用如下代码启动 Intent intent new Intent Intent ACTION VIEW intent setDataAndType Uri fr
  • Vuetify - 如何设置背景颜色

    我正在使用带有 Light 主题的 Vuetify 默认情况下 这会将主要内容的背景设置为浅灰色 我需要它是白色的 我想通过修改手写笔变量来覆盖它 但我似乎无法弄清楚哪个变量设置背景颜色 我按照中的所有步骤进行了操作docs https v
  • 如何使用 C# 语言将用户与机器人的对话数据存储到 azure SQL 数据库中?

    我目前正在研究 Bot 框架技术 在我当前的项目中 我想将 bot 对话数据存储到 azure SQL 数据库中 我开发了一个 ReviewBot 在其中我必须编写代码来按用户对任何酒店进行评论 评级 机器人与用户的通信工作正常 但我想使用
  • 使用 setInterval 时,如果我在 Chrome 中切换选项卡并返回,滑块会疯狂追赶

    我的网站上有一个 jQuery 滑块 转到下一张幻灯片的代码位于名为 nextImage 的函数中 我使用 setInterval 在计时器上运行我的函数 它完全符合我的要求 它在计时器上运行我的幻灯片 但是 如果我在 Chrome 中访问
  • 如何将 JavaScript 代码嵌入到 Google 协作平台页面中?

    我有一个 Google 协作平台页面 如何在其中嵌入 JavaScript 代码 而不实现小工具并在其中添加 JavaScript 代码 您可以运行一些 JavaScript 代码 但是在页面编辑期间 它将自动包装到一个简单的小工具中 并且
  • 阻止 Rails 表单标签修改文本

    我的一个视图中有下面的代码 但它始终呈现为主页 url 我怎样才能阻止它改变情况 br br 愚蠢 我知道 但这样就可以了 f label 之后的第一个参数实际上应该是正在编辑的对象的方法 所以您可能弄错了 我假设方法 字段名称 实际上是我
  • 通过拼凑对齐多个图例

    In 这个小插曲 https patchwork data imaginist com articles guides layout html controlling guides of 拼凑而成 https cran r project
  • 将 Json 响应解释为纯文本 [重复]

    这个问题在这里已经有答案了 我有以下代码 我需要解析响应 根据我的理解 该响应实际上保存在变量 transferFlag 中 但是 transferFlag 会提醒整个ajax代码 我需要 ajax 调用的响应 它实际上返回方法的值 get
  • 警告:找不到指定操作的配置:

    我遇到以下异常 请帮助解决这个问题 Jul 16 2013 11 18 40 AM org apache struts2 components Form evaluateExtraParamsServletRequest WARNING N
  • 如何将更新部署到在客户站点上运行的服务工作人员?

    假设我提供不同网站使用的推送通知服务 此服务需要在我的客户站点上安装 Service Worker 我希望该架构具有一些属性 完全静态资源 安装 Service Worker 文件 配置 JS 片段等过程只需完成一次 随时更新 Servic
  • 在通知区域切换中收听“深色主题”并收到更改通知

    我可以得到UI MODE NIGHT MASK通过致电resources configuration uiMode and Configuration UI MODE NIGHT MASK 我需要监听这个变量并在接收新值时更改我的主题 我想
  • uwsgi 选项 --wsgi-file 和 --module 无法识别

    我正在尝试使用 uwsgi 运行 Django 应用程序 我发现的大多数指令都引用 wsgi file 和 module 来指定应用程序 但 uwsgi 没有提及这些选项 当我尝试使用它们时 uwsgi s tmp uwsgi sock m
  • 在 Eclipse 的 Crashlytics 安装中找不到存储库

    我尝试将 Crashlytics SDK 安装到 Eclipse 中 但收到以下错误 安装软件 遇到问题 收集要安装的项目时发生错误 An error occurred while collecting items to be instal
  • 使用 JCo 从 SAP 系统读取表

    我试图从 SAP 系统读取表 但总是收到此错误 Exception in thread main com sap conn jco JCoRuntimeException 127 JCO ERROR FIELD NOT FOUND Fiel
  • 以与轴的纵横比一致的物理单位重新缩放箭袋箭头

    过去几个小时我一直在尝试定制matplotlib quiver没有太多运气 该文档非常混乱 我无法解析如何设置每个参数 在我的坐标轴中 一个垂直像素的物理距离比一个水平像素的物理距离小得多 并且我希望 quiver 将箭头自动缩放到此纵横比