matplotlib quiver箭图绘制案例

时间:2021-05-22

quiver绘制表示梯度变化非常有用,下面是学习过程中给出的两个例子,可以很好理解quiver的用法

from pylab import *close()## example 1x = linspace(0,10,40)y = x**2*exp(-x)u = array([x[i+1]-x[i] for i in range(len(x)-1)])v = array([y[i+1]-y[i] for i in range(len(x)-1)])x = x[:len(u)] # 使得维数和u,v一致y = y[:len(v)]c = randn(len(u)) # arrow颜色figure()quiver(x,y,u,v,c, angles='xy', scale_units='xy', scale=1) # 注意参数的赋值## example 2x = linspace(0,20,30)y = sin(x)u = array([x[i+1]-x[i] for i in range(len(x)-1)])v = array([y[i+1]-y[i] for i in range(len(x)-1)])x = x[:len(u)] # 使得维数和u,v一致y = y[:len(v)]c = randn(len(u)) # arrow颜色figure()quiver(x,y,u,v,c, angles='xy', scale_units='xy', scale=1) # 注意参数的赋值show()

结果如下:

补充知识:Matlab矢量图图例函数quiverkey

Matlab自带函数中不包含构造 quiver 函数注释过程,本文参照 matplotlib 中 quiverkey 函数,构造类似函数为 Matlab 中 quiver 矢量场进行标注。

quiverkey函数

首先看 matplotlib 中 quiverkey 如何定义的

quiverkey(*args, **kw)Add a key to a quiver plot. Call signature:: quiverkey(Q, X, Y, U, label, **kw) Arguments: *Q*: The Quiver instance returned by a call to quiver. *X*, *Y*: The location of the key; additional explanation follows. *U*: The length of the key *label*: A string with the length and units of the key Keyword arguments: *coordinates* = [ 'axes' | 'figure' | 'data' | 'inches' ] Coordinate system and units for *X*, *Y*: 'axes' and 'figure' are normalized coordinate systems with 0,0 in the lower left and 1,1 in the upper right; 'data' are the axes data coordinates (used for the locations of the vectors in the quiver plot itself); 'inches' is position in the figure in inches, with 0,0 at the lower left corner. *color*: overrides face and edge colors from *Q*. *labelpos* = [ 'N' | 'S' | 'E' | 'W' ] Position the label above, below, to the right, to the left of the arrow, respectively. *labelsep*: Distance in inches between the arrow and the label. Default is 0.1 *labelcolor*: defaults to default :class:`~matplotlib.text.Text` color. *fontproperties*: A dictionary with keyword arguments accepted by the :class:`~matplotlib.font_manager.FontProperties` initializer: *family*, *style*, *variant*, *size*, *weight* Any additional keyword arguments are used to override vectorproperties taken from *Q*. The positioning of the key depends on *X*, *Y*, *coordinates*, and*labelpos*. If *labelpos* is 'N' or 'S', *X*, *Y* give the positionof the middle of the key arrow. If *labelpos* is 'E', *X*, *Y*positions the head, and if *labelpos* is 'W', *X*, *Y* positions thetail; in either of these two cases, *X*, *Y* is somewhere in themiddle of the arrow+label key object. Additional kwargs: hold = [True|False] overrides default hold state

可以看到主要参数有这么些个

quiver绘图指针

图例位置 X, Y

标注大小 U

标注单位字符

其他参数

1). 输入坐标 X, Y 单位
2). (文字)标注在图例哪个位置
3). 标注与图例相对距离
4). 标注字体颜色

使用方法:

对应Matlab函数也应该使用这么个流程

使用quiver绘图

将quiver返回指针与图例位置坐标和大小等作为参数传入

示例

[x,y] = meshgrid(0:0.2:2,0:0.2:2);u = cos(x).*y;v = sin(x).*y;figure; Qh = quiver(x,y,u,v);quiverkey(Qh, 0.5, 2.5, 1, 'm/s', 'Color', 'r', 'Coordinates', 'data')

最终效果图

代码

function Q = quiverkey(Q, X, Y, U, label, varargin)%QUIVERKEY legend for quiver%% QUIVERKEY(Q, X, Y, U, label) % % Arguments:% Q : The quiver handle returned by a call to quiver% X,Y : The location of the legend% U : The unit length. If U<0, the arrow will be reversed% label : The string with the length and units of the key% % Addition arguments:% Coordinates = [ 'axes' | 'data'(default) ]% % 'axes' & 'figure' : 'axes' and 'figure' are normalized % coordinate systems with 0,0 in the lower left % and 1,1 in the upper right;% 'data' : use the axes data coordinates% % LabelDistance : Distance in 'coordinates' between the arrow and the% label. Deauft is 0.1 (units 'axes').% % Color : overrides face and edge colors from Q.% % LabelPosition = [ 'N' | 'S'(default) | 'E' | 'W' ]% % Position the label above, below, to the right, % to the left of the arrow, respectively.% % LabelColor : defaults to black% % Examples: % % [x,y] = meshgrid(0:0.2:2,0:0.2:2);% u = cos(x).*y;% v = sin(x).*y;% figure; Qh = quiver(x,y,u,v);% quiverkey(Qh, 0.5, 2.5, 1, 'm/s', 'Color', 'r', 'Coordinates', 'data')% % Author:% li12242 - Department of Civil Engineering in Tianjin University% Email:% li12242@tju.edu.cn% %% get input argumentif nargin < 5 error('Input arguments" Number incorrect!')endif isempty(varargin) && mod(length(varargin), 2) ~= 0 error('Input arguments donot pairs!')else [CoorUnit, LabelDist, Color, LabelPosition, LabelColor] = getInput(varargin);end%% add legend arrow% get original dataxData = get(Q, 'XData'); yData = get(Q, 'YData');uData = get(Q, 'UData'); vData = get(Q, 'VData');% get axes propertieshaxes = get(Q, 'Parent');xLim = get(haxes, 'XLim'); yLim = get(haxes, 'YLim');NextPlot = get(haxes, 'NextPlot');% set axes propertiesset(haxes, 'NextPlot', 'add')if strcmp(CoorUnit, 'axes') % position of legend arrow xa = xLim(1) + X*(xLim(2) - xLim(1)); ya = yLim(1) + Y*(yLim(2) - yLim(1));else xa = X; ya = Y;end% add legend arrow into data vectorxData = [xData(:); xa]; yData = [yData(:); ya];uData = [uData(:); U]; vData = [vData(:); 0];% reset dataset(Q, 'XData', xData, 'YData', yData, 'UData', uData, 'VData', vData);set(Q, 'Color', Color)%% add textdx = LabelDist*(xLim(2) - xLim(1));dy = LabelDist*(yLim(2) - yLim(1));% set position of labelswitch LabelPosition case 'N' xl = xa; yl = ya + dy; case 'S' xl = xa; yl = ya - dy; case 'E' xl = xa + dx; yl = ya; case 'W' xl = xa - dx; yl = ya;end% switchth = text(xl, yl, [num2str(U), ' ', label]);set(th, 'Color', LabelColor);% turn axes properties to originalset(haxes, 'NextPlot', NextPlot)end% func%% sub functionfunction [CoorUnit, LabelDist, Color, LabelPosition, LabelColor] = getInput(varcell)% Input:% varcell - cell variable% Output:% nargin = numel(varcell);%% set default argumentsCoorUnit = 'data';LabelDist = 0.05; % units 'axes'Color = 'k';LabelPosition = 'S';LabelColor = 'k';%% get input argumentscontour = 1;while contour < nargin switch varcell{contour} case 'Coordinates' CoorUnit = varcell{contour+ 1}; case 'LabelDistance' LabelDist = varcell{contour+ 1}; case 'Color' Color = varcell{contour+ 1}; case 'LabelPosition' LabelPosition = varcell{contour+ 1}; case 'LabelColor' LabelColor = varcell{contour+ 1}; otherwise error('Unknown input argument.') end% switch contour = contour + 2;end% whileend% fun

以上这篇matplotlib quiver箭图绘制案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章