爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 655|回复: 10

[求助] quiver画风速的参考风速问题

[复制链接]

新浪微博达人勋

发表于 2024-5-18 19:34:18 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
这个代码可以绘制风速,绘制的风速受到quiver函数的scale参数的影响会变化长度。因此需要在图中增加一个参考值(也即红色的风速代表10m/s) 如何让这个标志出现在色卡的上方?
code.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2024-5-18 19:36:26 | 显示全部楼层
本帖最后由 zhanghm2018 于 2024-5-18 19:46 编辑

这是上述代码的绘制结果
pic.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-5-18 19:43:41 | 显示全部楼层
下图为想要实现的结果
target.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-18 22:11:19 | 显示全部楼层
把 QuiverKey 的 _set_transform 私有方法覆盖掉。
  1. import matplotlib.pyplot as plt
  2. from matplotlib.cm import ScalarMappable

  3. fig, ax = plt.subplots()
  4. mappable = ScalarMappable()
  5. cbar = fig.colorbar(mappable, ax=ax)

  6. Q = ax.quiver(0.5, 0.5, 1, 1, scale=20)
  7. qk = ax.quiverkey(Q, X=0.5, Y=1.05, U=2, label='2 m/s')
  8. qk._set_transform = lambda: qk.set_transform(cbar.ax.transAxes)

  9. plt.show()
复制代码


quiver.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-19 09:24:24 | 显示全部楼层
感谢,学习一下
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-5-19 12:04:04 | 显示全部楼层
灭火器 发表于 2024-5-18 22:11
把 QuiverKey 的 _set_transform 私有方法覆盖掉。

妙啊 我就是出不了Q的那个ax。 学到了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-19 12:24:41 | 显示全部楼层
zhanghm2018 发表于 2024-5-19 12:04
妙啊 我就是出不了Q的那个ax。 学到了

直觉来说让 QuiverKey 使用 colorbar 的 Axes 的坐标系就行,就是指定参数 transform=cbar.ax.transAxes 就行。然后很简单就可以把参考风速定位到 colorbar 的正上方。
但神秘的是 QuiverKey 没有 transform 参数,而是用的 coordinates 参数,所以只能用这种“篡改”底层的方法。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-5-19 15:34:44 | 显示全部楼层
灭火器 发表于 2024-5-19 12:24
直觉来说让 QuiverKey 使用 colorbar 的 Axes 的坐标系就行,就是指定参数 transform=cbar.ax.transAxes  ...
  1. import matplotlib.pyplot as plt
  2. from matplotlib.cm import ScalarMappable

  3. fig, ax = plt.subplots()
  4. mappable = ScalarMappable()
  5. cbar = fig.colorbar(mappable, ax=ax)



  6. Q = ax.quiver(0.5, 0.5, 5, 0, scale=20)
  7. qk = ax.quiverkey(Q, X=1.1, Y=1.02, U=2, label='2 m/s')
  8. # qk._set_transform = lambda: qk.set_transform(cbar.ax.transAxes)
  9. plt.title('aaaaa')
  10. plt.show()
复制代码
b.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-5-19 15:37:43 | 显示全部楼层
灭火器 发表于 2024-5-19 12:24
直觉来说让 QuiverKey 使用 colorbar 的 Axes 的坐标系就行,就是指定参数 transform=cbar.ax.transAxes  ...

我尝试了一下 直接在QuiverKey上就可以改。单个图是可以的。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-19 19:16:02 | 显示全部楼层
因为 quiverkey 方法默认就是使用 quiver 所在的 Axes 的坐标系,所以你指定 X=1.1 也行。
不过当 Axes 或 colorbar 的大小、位置发生变化,X=1.1 的位置就不一定对应 colorbar 中间正上方了。
所以我用的是 colorbar 的坐标系,指定 X=0.5,即中间一半。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表