首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matplotlib 绘图命令:quiver

matplotlib 绘图命令:quiver

作者头像
bugsuse
发布2020-04-20 13:48:54
4.5K0
发布2020-04-20 13:48:54
举报
文章被收录于专栏:气象杂货铺气象杂货铺

quiver(*args, **kw)

绘制 2D 矢量场

调用方式如下:

quiver(U, V, **kw)

quiver(U, V, C, **kw)

quiver(X, Y, U, V, **kw)

quiver(X, Y, U, V, C, **kw)

参数说明:

X 和 Y 是箭头的 x 和 y 坐标(默认是箭头的尾部)

U 和 V 是箭头矢量的 x 和 y 分量

C 是映射箭头和颜色的颜色数组

所有参数可能是 1D或2D数组及序列。如果 X 和 Y 缺省,将视为规则网格。如果 U 和 V是 2D 数组,但 X 和 Y 是 1D 数组,并且 len(X) 和 len(Y) 与 U 的列和行相同,则使用 numpy.meshgrid 生成 2D 网格。

U,V,C 可能是 masked 数组,但是目前不支持 X 和 Y 。

关键词参数:

units: [ ‘width’ | ‘height’ | ‘dots’ | ‘inches’ | ‘x’ | ‘y’ | ‘xy’ ]

箭头单位

  • ‘width’ or ‘height’: axes 的宽或高
  • ‘dots’ or ‘inches’: pixels 或 inches, 依赖于 figure dpi
  • ‘x’, ‘y’, or ‘xy’: X, Y, 或 sqrt(X^2+Y^2) 数据单位

箭头比例的不同取决于 units。 units 为 'x' 或 'y' 时, 箭头会变大;对于其它单位,箭头大小不会发生变化。units 为 ’width‘ 或 'height' 时,当调整窗口大小时,箭头的大小会随 axes 宽和高的变化而变化,而当 units 为 'dots' 或 'inches' 时,改变窗口大小并不会改变箭头的大小。

angles: [ ‘uv’ | ‘xy’ | array ]

默认为 ’uv‘,箭头 axes 宽高比为1。如果 U == V,那么沿着水平轴逆时针旋转 45 度是箭头的方向(箭头指向右侧)。如果是 'xy',箭头的点由 (x,y) 指向 (x + u, y + v)。使用此设置可以绘制梯度场。也可以将随机角度作为数组进行传递(同样沿水平轴逆时针旋转)。注意:angles = 'xy' 时,反转数据轴的时候同样会反转arrow。

scale: [ None | float ]

每单位长度的数据单位。比如:每个绘图宽度单位为 m/s。scale 值越小,arrow 越长。当为 None 时,自适应算法会根据 平均矢量长度 和 矢量数 计算一个值。箭头的长度单位可以通过 scale_units 参数设置。

scale_units: None, 或 units 参数选项

例如:如果 scale_units = 'inches',scale = 2,(u, v) = (1, 0),那么矢量将是 0.5 inches。如果 scale_inches = 'width',那么矢量将是 axes 宽的一半

如果 scale_inches = ’x‘,那么矢量长度将是 x-axis 单位的一半。要在 xy 平面绘制矢量图,u 和 v 单位要和 x 和 y 一致。使用如下设置 “angles=’xy’, scale_units=’xy’, scale=1”

width:

杆的宽度。默认值取决于 units 参数的设置及矢量数。典型的起始值为 绘图宽度的 0.005 倍。

headwidth: scalar

箭头宽度,为 杆宽的倍数。默认值为 3.

headlength: scalar

箭头长度, 为 杆宽的倍数。 默认值为 5。

headaxislength: scalar

在杆的交点处箭头的长。 默认值为 4.5。

minshaft: scalar

小于箭头 scale 的长度,以箭头长度为单位。不要设置此值小于1,否则那些小箭头会变得很奇怪。默认值为1。增大此值会使箭头变细。一般情况下不需要更改此值。

minlength: scalar

如果箭头的长度小于此值,将绘制以此值为半径的点。默认值为 1

pivot: [ ‘tail’ | ‘mid’ | ‘middle’ | ‘tip’ ]

旋转轴

color: [ color | color sequence ]

如果 C 给定了,则 color 参数将不会生效。

默认是稍微后突一些的箭头。

  • 如果要使箭头是 三角形,设置参数 headlength == headaxislength;
  • 如果要让箭头更尖,减小 headwidth 或是 增加 headlength 和 headaxislength 参数;
  • 为了让箭头相对于杆更小,可减小所有的 head 类参数。

说的再多都没有图形看的直观。

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X, Y, U, V, units='xy')

plt.show()

可以看出上图矢量箭头比较密集,下面可以仅选取数组的一部分来绘制

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy')

plt.show()

可以看出箭头的密度变小了,如果放大看的话,箭头并不是三角形的,下面设置为三角形看看

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 5)

plt.show()

由放大后的图可以看出箭头已经变为三角形了

再试试其它参数看看

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 5, headwidth = 5)

plt.show()

和之前相比, headwidth 参数设置为 5,默认值为3,也就是说箭头宽度为杆宽的5倍。与上图相比,箭头变大了。

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 5, headwidth = 5, width = 0.01)

plt.show()

杆宽变小后的图

之前的杆宽设置的都是程序自行设定的,基本上都符合要求,所以一般情况下,width 参数是不需要设置的。

如果想让箭头变尖一些呢

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 3, headwidth = 5)

plt.show()

减小 headaxislength

也可以这样做来达到上面的效果

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 7, headaxislength = 5, headwidth = 5)

plt.show()

仔细对比上面两张图,可以发现,增大 headlength 虽然也能让箭头变成明显的后突类型,但是箭头的长度增加了。

如果减小 headlength 呢

import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)

plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 3, headaxislength = 5, headwidth = 5)

plt.show()

谁会需要这种形状的矢量箭头呢==

增大 headaxislength 同样可以得到上图的矢量箭头==

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档