使用matplotlib的quiver绘制二维箭头图

news2024/11/17 15:37:47

使用ax.quiver绘制二维箭头图

1. matplotlib的quiver函数的调用方式

quiver函数是axes类的成员函数,其基本调用方式为:

quiver([X, Y], U, V, [C], **kwargs)
[X,Y]是箭头的位置,U,V是箭头的方向,C是箭头颜色。
具体而言,C是一个与X,Y的尺寸相同的数组,每个元素记录与箭头颜色相关的值。这些值通过normcmap参数映射到真正的颜色值。设置了C参数之后,color参数不生效。
color是直接设置箭头颜色的参数,若它为一个值,则表示所有箭头都是同一种色彩;也可以是与X,Y的尺寸相同的数组,记录每个箭头的颜色。
箭头方向参数angles可以取'uv'(默认)或'xy'。'uv’表示箭头指向采用屏幕坐标系中的方向,与X,Y所在坐标系的定义无关;'xy’表示箭头方向在数据坐标系中,箭头从(x,y)指向(x+u,y+v)。
箭头的尺寸参数包括:
scale_unit箭头长度的单位,可以取'width', 'height', 'dots', 'inches', 'x', 'y', 'xy'。例如,(u,v)=(1,0),scale取1.0,当scale_unit取’width’时,箭头的长度是轴的宽度;当scale_unit取’height’时,箭头长度是轴的高度;
长度,用scale参数来调节。若不设置scale参数,则matplotlib自动调整所有箭头的长度;若设置scale的值,值越小,箭头的显示越长。scale取1时,箭头的长度等于U,V的计算值×scale_unit

通过下面的例子认识scale_units:

import matplotlib.pyplot as plt

ax.quiver(0,25,0.5,0,scale_units='width',scale=1.0, color='red')
ax.quiver(0,50,1,0,scale_units='width',scale=1.0, color='red')
ax.quiver(0,75,1.5,0,scale_units='width',scale=1.0, color='red')

ax.quiver(25,0,0,0.5,scale_units='height',scale=1.0, color='green')
ax.quiver(50,0,0,1,scale_units='height',scale=1.0, color='green')
ax.quiver(75,0,0,1.5,scale_units='height',scale=1.0, color='green')

ax.set_xlim(0,100)
ax.set_ylim(0,200)
ax.set_aspect(1)
plt.show()

运行上面的代码,会得到三根红色的水平箭头和三根绿色的垂直箭头。他们的长度分别是axes(坐标轴)的x范围和y范围的0.5倍、1倍和1.5倍。

通过下面的例子认识angles:

ax.quiver(50,50,0.5,0,scale_units='width',scale=1.0, color='red', label='Angles=uv')
ax.quiver(50,50,0.5,0,scale_units='width',scale=1.0, color='blue', angles='xy', label='Angles=xy')
ax.quiver(50,0,0,1,scale_units='height',scale=1.0, color='green')
ax.set_xlim(0,100)
ax.set_ylim(0,200)
ax.invert_xaxis()
ax.legend()
ax.set_aspect(1)
plt.show()

运行结果如图所示,其中红色箭头、绿色箭头为默认的angles参数的绘制效果;蓝色箭头为angles='xy’时的绘制效果,即箭头方向受数据坐标系影响;
在这里插入图片描述

1.1循环绘制与批量绘制

当我们有大量箭头想绘制时,一般会选择在for循环中不断调用quiver完成绘制。这种方式虽然便于理解,但是效率太低。当待绘制的箭头数量太多时(1,000,000量级以上),显示绘图结果的速度极慢。

循环绘制的代码如下:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

grid_cols=80
grid_rows=100
grid_u = np.random.randn(grid_rows, grid_cols)
grid_v = np.random.randn(grid_rows, grid_cols)
grid_val = np.sqrt(grid_u**2+grid_v**2)

jet_colormap = mpl.colormaps['jet']# 0 is blue and 1 is red.

# call quiver in the loop
ax = plt.axes()
for i in range(grid_rows):
    for j in range(grid_cols):
        ax.quiver(i,j,grid_u[i,j],grid_v[i,j],grid_val[i,j],scale=1, scale_units='xy',cmap=jet_colormap, norm=plt.Normalize(0.0,1.0))
            

ax.set_aspect(1)
plt.show()

所幸,quiver函数可以仅调用一次,批量绘制所有箭头数据,这样的速度会远远快于循环绘制。使用这种方式之前,需要实现把箭头数据整理到数组中。一般使用np.meshgrid来组织X,Y数据。
批量绘制的代码如下:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

grid_cols=80
grid_rows=100
grid_u = np.random.randn(grid_rows, grid_cols)
grid_v = np.random.randn(grid_rows, grid_cols)
grid_val = np.sqrt(grid_u**2+grid_v**2)

jet_colormap = mpl.colormaps['jet']# 0 is blue and 1 is red.

grid_x, grid_y = np.meshgrid(np.arange(grid_cols),np.arange(grid_rows))
ax.quiver(grid_x,grid_y,grid_u,grid_v,grid_val,scale=1,scale_units='xy', cmap=jet_colormap, norm=plt.Normalize(0.0,1.0))
ax.set_aspect(1)
plt.show()

分别运行它们,可以感受到绘制速度快慢。

1.2用colormap和Normalize函数来调节箭头颜色

Matplotlib库内置了一系列的颜色映射,包括亮度渐变色、冷暖过渡色、循环色等、如图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果想获得其中的'jet'颜色映射,则:

import matplotlib as mpl

jet_colormap = mpl.colormaps['jet']

或者直接在需要颜色映射的地方调用,例如:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt


grid_cols=80
grid_rows=100
grid_u = np.random.randn(grid_rows, grid_cols)*2
grid_v = np.random.randn(grid_rows, grid_cols)*2
grid_val = np.sqrt(grid_u**2+grid_v**2)

jet_colormap = mpl.colormaps['jet']

grid_x, grid_y = np.meshgrid(np.arange(grid_cols),np.arange(grid_rows))
ax = plt.axes()
ax.quiver(grid_x,grid_y,grid_u,grid_v,grid_val,scale=1,scale_units='xy', cmap='jet',#或cmap=jet_colormap,都对
           norm=plt.Normalize(0.0,1.0))# 可以试试norm=plt.Normalize(0.0,4.0)  norm=plt.Normalize(0.0,8.0)
plt.show()

上面的代码中,plt.Normalize(vmin, vmax,clip)函数将数据按照[vmin,vmax]线性地归化到[0,1]区间。对于超出[vmin,vmax]的数据,若clip值为False,则依然将这些数据按[vmin,vmax]->[0,1]的线性映射求得值;若clip值为True,则大于vmax的统一映射为1,小于vmin的值统一映射为0。
vmin, vmax缺省时,则根据给定数据计算最小值和最大值来初始化这两个值。代码如下:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

grid_cols=80
grid_rows=100
grid_u = np.random.randn(grid_rows, grid_cols)*2
grid_v = np.random.randn(grid_rows, grid_cols)*2
grid_val = np.sqrt(grid_u**2+grid_v**2)

jet_colormap = mpl.colormaps['jet']

grid_x, grid_y = np.meshgrid(np.arange(grid_cols),np.arange(grid_rows))
ax = plt.axes()
ax.quiver(grid_x,grid_y,grid_u,grid_v,grid_val,scale=1,scale_units='xy', cmap='jet',#或cmap=jet_colormap,都对
           norm=plt.Normalize())#或norm=mpl.colors.LogNorm(1.0,10.0),对数标准化
plt.show()

了解更多可参考:
选择颜色映射
创建颜色映射
Matplotlib中的各种Normalize方法

2.用numpy的ma.masked_where过滤掉不希望绘制的箭头

有时,格网数据中存在我们不想绘制的箭头,例如值大于0.5的箭头,应该怎么做呢?第一反应写下来的代码如下所示:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

grid_cols=40
grid_rows=60
grid_u = np.random.randn(grid_rows, grid_cols)*2
grid_v = np.random.randn(grid_rows, grid_cols)*2
grid_val = np.sqrt(grid_u**2+grid_v**2)

jet_colormap = mpl.colormaps['jet']# 0 is blue and 1 is red.

# call quiver in the loop
ax = plt.axes()
for i in range(grid_rows):
    for j in range(grid_cols):
        if grid_val[i,j] < 0.5:# 仅绘制值小于0.5的箭头
            ax.quiver(i,j,grid_u[i,j],grid_v[i,j],scale_units='xy',cmap=jet_colormap, width=0.003, headwidth = 0.003)
            
ax.set_aspect(1)# 设置x\y轴比例一致
plt.show()

这又回到逐个箭头调用quiver的龟速模式了!幸好,quiver函数支持输入masked_array类型的数据,masked_array中除了数据数组之外,还有一个标记是否mask的布尔类型数组,来标记某些数据元素。
如此一来,我们只需要在调用quiver之前,按照我们的标准调用np.ma.masked_where()来标记不想绘制的箭头即可。
np.ma.masked_where(condition, a)返回的是标记mask之后的数组,第一个参数condition是条件数组,大小与a一致,即满足这个条件的a的元素被mask;第二个参数a是输入的待标记数组。第三个参数copy默认为Ture,返回a的一个复制品,若为False,则返回a的一个视图(view)。
改进的代码如下:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

grid_cols=40
grid_rows=60
grid_u = np.random.randn(grid_rows, grid_cols)*2
grid_v = np.random.randn(grid_rows, grid_cols)*2
grid_val = np.sqrt(grid_u**2+grid_v**2)

jet_colormap = mpl.colormaps['jet']

# 过滤值大于0.5的箭头
grid_val = np.ma.masked_where(grid_val>0.5, grid_val)

# plus 0.5 to make the quiver start from center of a grid.
grid_x, grid_y = np.meshgrid(np.arange(grid_cols),np.arange(grid_rows))
# 一次性绘制所有箭头
ax = plt.axes()
ax.quiver(grid_x,grid_y,grid_u,grid_v,grid_val,scale=1,scale_units='xy', cmap=jet_colormap)
# 设置x\y轴比例一致
ax.set_aspect(1)
plt.show()

参考

使用quiver函数的其他高阶参数:

quiver绘制箭头进阶

matplotlib给出的箭头绘制示例代码:
quiver官方示例

关于使用numpy的masked_array来表达有标记的数组,可参考:
masked_where
Masked array operations

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1615100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多项式轨迹规划

公众号“轻松玩转机器人”&#xff0c;欢迎关注。 1、简介 常用的多项式规划一般泛指3次、5次和7次等多项式规划&#xff0c;4次多项式规划用到的比较少&#xff0c;暂不介绍。 为什么奇数次多项式比较常用呢&#xff1f;因为其有偶数个系数&#xff01; 偶数个系数有什么用…

泛型的初步认识(1)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

Unity中的UI系统之UGUI

目录 概述UGUI基础——六大基础组件六大基础组件概述Canvas画布组件CanvasScaler画布缩放控制器组件必备知识恒定像素模式缩放模式恒定物理模式3D模式 Graphic Raycaster图形射线投射器EventSystem和Standalone Input ModuleRectTransform UGUI基础——三大基础控件Image图像控…

【解决】Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed

问题原因&#xff1a; 在Java8及高版本以上的版本在源应用程序不信任目标应用程序的证书&#xff0c;因为在源应用程序的JVM信任库中找不到该证书或证书链。也就是目标站点启用了HTTPS 而缺少安全证书时出现的异常 解决方案&#xff1a; 我使用的是忽略证书验证 public clas…

vs code server for wsl closed unexpectedly

前言&#xff1a; 我的Windows 版本&#xff1a; 10.0.19045.4291 &#xff08;如果你是Win11或者你要使用WSL2请谨慎&#xff09; 之前是可以用的&#xff0c;但安装Vmware&#xff08;并安装了Ubuntu进行了一番实验后&#xff0c;就出现如标题所述问题&#xff09; 问题&a…

内存满了如何处理?

目录 虚拟内存 内存分配过程 直接内存回收和后台内存回收 回收内存的触发标准 那些内存被回收呢? 内存回收后,内存还是不够怎么办呢? 虚拟内存 介绍操作系统内存如何使用时,不可以避免的先认识到虚拟内存 首先我们通过虚拟内存的作用,来认识一下: 1.虚拟内存可以使得…

基础SQL DML-插入语句

插入语句前&#xff0c;我们先创建一个表。表的创建在DDL语句里面涉及&#xff0c;可以参考&#xff1a;小赖同学吖-CSDN博客 我们创建一个员工表进行数据的插入操作 插入&#xff08;添加&#xff09;语句的语法 给员工表添加一条记录 给员工表添加多条记录 也可以通过下面的方…

Python 面向对象——2.类与对象实例属性补充解释,self的作用等

本章学习链接如下&#xff1a; Python 面向对象——1.基本概念 实例的属性 1.创建对象 在上一小节的学习中我们提到了类中的变量与函数变量的区别&#xff0c;self.param1和param1&#xff0c;接下来我们继续详细解释这个知识点。 当我们创建一个学生的类&#xff0c;比如…

铜缆与网线:数字时代的信息高速公路

在现代社会&#xff0c;信息传输已成为日常生活的重要部分。从个人通信到全球数据中心&#xff0c;铜缆和网线扮演着至关重要的角色。本文将详细介绍铜缆和网线的类型、特点以及它们在数字时代的应用。 铜缆的种类与应用 铜缆的类型 UTP&#xff08;无屏蔽双绞线&#xff09;&…

登录的几种方式

一、session 1、客户端发送请求&#xff0c;服务器将登录信息存储在 Session 中&#xff0c;Session 依赖于 Cookie&#xff08;cookie指的就是在浏览器里面存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。Cookie实际上是一小段的文本信息。&#xff09;&…

Arthas介绍及使用技巧

文章目录 简介能做什么&#xff1f; 使用下载并启动arthas选择应用 java 进程退出 arthas 常用查看命令帮助查看 dashboard通过 thread 命令来获取到线程的栈通过 jad 来反编译 Classwatch 查看方法出入参、sc 搜索类: 查看已加载类所在的包monitor 方法执行监控trace 方法内调…

牛客NC238 加起来和为目标值的组合【中等 DFS C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/172e6420abf84c11840ed6b36a48f8cd 思路 本题是组合问题&#xff0c;相同元素不同排列仍然看作一个结果。 穷经所有的可能子集&#xff0c;若和等于target&#xff0c;加入最终结果集合。 给nums排序是为了方便…

day04 51单片机-矩阵按键

1 矩阵按键 1.1 需求描述 本案例实现以下功能:按下矩阵按键SW5到SW20,数码管会显示对应的按键编号。 1.2 硬件设计 1.2.1 硬件原理图 1.2.2 矩阵按键原理 1.3软件设计 1)Int_MatrixKeyboard.h 在项目的Int目录下创建Int_MatrixKeyboard.h,写入以下内容。 #ifndef __…

Pyhton Sqlite3手机数据库

代码结果 Code import sqlite3 connsqlite3.connect(test.db) csconn.cursor() create_tb_sqlcreate table if not exists info(id int primary key,name text,age int)cs.execute(create_tb_sql)# cs.execute(insert into info(id,name,age) values(3,"dog_Senior&quo…

Ubuntu Server 20.04 LTS 64bit安装ftp服务

1.安装vsftpd sudo apt install vsftpd2.配置vsftpd sudo vim /etc/vsftpd.conf write_enableYES # 启用任何形式的FTP写入命令&#xff0c;即可以修改文件local_umask022 # 本地用户创建文件的 umask 值&#xff0c;默认是被注释的connect_from_port_20YES # 针对 PORT 类型…

java 溯本求源之基础(十八)之Monitoring--jmc

1.JMC概述 JMC全称Java Mission Control&#xff0c;集成了多个功能强大的组件&#xff0c;其中最核心的两部分是管理控制台和Java Flight Recorder。管理控制台允许开发者实时监控应用的运行状态&#xff0c;捕捉各种性能指标&#xff1b;而Java Flight Recorder则提供了一种高…

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日&#xff0c;中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选&#xff0c;深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…

力扣(leetcode) 407. 接雨水 II 3D接雨水

力扣(leetcode) 407. 接雨水 II 3D接雨水 给你一个 m x n 的矩阵&#xff0c;其中的值均为非负整数&#xff0c;代表二维高度图每个单元的高度&#xff0c;请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输…

IEC104协议

1. 简介 IEC104规约是一个广泛应用于电力、城市轨道交通等行业的国际标准。 2. 术语解释 遥脉 (电度量)&#xff1a; 是指对现场某装置所发出的脉冲信号进行周期累计的一种远程计数操作。 其实&#xff0c;遥脉也可以看成是被具体规定了采用脉冲计数作为测量方法的一种遥测…

日本二次元团建国内院线:一周一部,占据36.2%票房

从《你想活出怎样的人生》开始&#xff0c;到《哈尔的移动城堡》结束&#xff0c;日本动画正在占据国内院线的整个4月份档期。 包括《数码宝贝02&#xff1a;最初的召唤》、《间谍过家家 代号&#xff1a;白》多部作品在内&#xff0c;整个国内四月份院线日本动画平均一周上映…