若是想用风羽画风场,请看另外一篇python画风羽及风羽定义html
https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.quiverpython
上面是官方文档的连接算法
箭头关键的一个参数是长度,长度能够经过参数scale来设置,若是你屡次使用quiver(),只要保证参数scale一致,那么箭头长度就会与风速的值成正比,可按照下面我贴出的代码那样设置参数。建议scale设置成30-50,100以内也都还能够。箭头宽度能够经过width=0.005开始设置。箭头颜色能够经过传入颜色列表来控制。api
Axes.
quiver
(*args, data=None, **kw)数组
用于画二维的箭头ui
调用quivers有如下几种形式(signatures):spa
quiver(U, V, **kw) quiver(U, V, C, **kw) quiver(X, Y, U, V, **kw) quiver(X, Y, U, V, C, **kw)
U、V是箭头数据(data),X、Y是箭头的位置,C是箭头的颜色。这些参数能够是一维或二维的数组或序列。.net
若是X、Y不存在(absent),他们将做为均匀网格被生成。若是U和V是2维的数组,X和Y是1维数组,而且len(X)和len(Y)与U的列(column)和行(row)纬度相匹配(match),那么X和Y将使用numpy.meshgrid()——用于产生一个矩阵,具体可参考:meshgrid使用方法——进行扩展。scala
默认设置会自动将箭头的长度缩放到合理的大小。要改变箭头的长度请参看 scale 和scale_units两个关键字参数(kwargs:关键字参数,参看文章最后有关键字参数与可变参数的区别)rest
默认值给出一个稍微后掠(swept-back)的箭头;若要使箭头头部呈三角状,则要确保headaxislength与headlength相同。若要使箭头更尖锐(more pointed),则应减少headwidth或者增大headlength和headaxislength。若要使箭头头部相对于箭杆(shaft)更小一些,则应将全部头部参数都减少(scale down)。你最好不要单独留下minshaft(You will probably do best to leave minshaft alone.)
线宽和边缘颜色能够用于自定义箭头轮廓(outlines)。
参数 |
X: 1D or 2D array, sequence, optional 1维或2维数组,序列(sequence),可自选(optional) 箭头位置的x坐标 |
Y:1D or 2D array, sequence, optional 1维或2维数组,序列,可自选 箭头位置的y坐标 |
|
U: 1D or 2D array or masked array, sequence 1维或2维数组或掩码数组(参看masked array https://blog.csdn.net/liukai2918/article/details/78419302),序列 箭头矢量的x份量 |
|
V:1D or 2D array or masked array, sequence 1维或2维数组或掩码数组,序列 箭头矢量的y份量 |
|
C: 1D or 2D array, sequence, optional 1维或2维数组,序列(sequence),可自选 箭头颜色 |
|
units(单位): [ 'width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy' ] 箭头尺寸(除长度外)以此单位的倍数计算——便是说选定单位后,箭头尺寸便是此单位的倍数 ‘width’或’height’:轴(axis)的宽度或高度 ‘dots’或’inches’:像素或英寸,基于图的dpi ‘x’, ‘y’或‘xy’:分别是X、Y或X2+Y2的数据单位(data units) 箭头依单位不一样而不一样。对于’x’或’y’,箭头会随着其一的增大(zoom in)而增大;对于其余单位,箭头的大小与缩放状态(zoom state)无关。对于’width’或’height’,当窗口重置时,箭头的大小会随着轴(axes)的宽度和高度的增大而增大;低于赞成’dots’或’inches’。重置不会改变箭头。 |
|
angles: [‘uv’ | ‘xy’], array, 可自选 用于决定箭头角度的方法,默认是’uv’ ‘uv’:箭头的纵横比(axis aspect ratio)为1,因此若U*==*V,则绘图上箭头的方向与水平轴逆时针呈45度(正向右)。 ‘xy’: 箭头从(x,y)指向(x + u,y + v)。例如,使用它来绘制渐变场(gradient field)。 或者,能够将任意角度指定为以水平轴逆时针方向的度数值的数组。 注意:反转数据轴将相应地仅使用angles='xy'反转箭头。 |
|
scale : None, float, optional 每一个箭头长度单位的数据单位数量,例如,每一个绘图宽度m / s;参数scale越小箭头越长。默认是None 如果None,一个简单的自动缩放算法将被采用,基于平均矢量长度和适量的数量。箭头长度单位由scale_units参数给出。 |
|
scale_units : [ 'width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy' ], None, optional 若是关键字参数scale是None,那么箭头长度单位默认是None 例如:scale_units是’inches’,scale是2.0,(u,v)=(1,0),那么矢量将会是0.5英寸长。 若是scale_units是’width/height’,那么矢量长度是轴’width/height’的半长 若是scale_units是’x’那么矢量是x轴单位的0.5倍。要在x-y平面上画矢量,使得u和v与x和y有相同的单位,则应另angles=’xy’, scale_units’xy’, scale=1. |
|
width : scalar(标量), optional 箭杆(shaft)的宽度,以箭头单位衡量。默认是由以上单位的选择和矢量数量来决定。经常使用的初始值是0.005倍的画的宽度(width of the plot) |
|
headwidth : scalar, optional |
|
头部宽度相对于箭杆宽度的倍数,默认是3倍 |
|
headlength : scalar, optional 轴交叉处的头部长度,默认是4.5 |
|
minshaft : scalar, optional 箭头比例的长度,以头部长度为单位。不要将其设置为小于1,不然小箭头看起来会很糟糕 |
|
minlength : scalar, optional 最小长度为轴宽的倍数;若是箭头长度小于此值,则绘制该直径的点(六边形)。默认值为1 |
|
pivot : [ 'tail' | 'mid' | 'middle' | 'tip' ], optional 箭头在网格点上的部分;箭头围绕这一点旋转,所以称为枢轴。 |
|
color : [ color | color sequence ], optional 这是PolyCollection facecolor kwarg的同义词。若是设置了C,颜色就没有效果。 |
quiver(*args, **kw)
import matplotlib.pyplot as plt import math from mpl_toolkits.basemap import Basemap from pylab import * import numpy as np mpl.rcParams['font.sans-serif'] = ['SimHei'] for i in range(1,3): plt.subplot(2, 1, i) ax = plt.gca() wind = [x for x in range(1,9)] # angle = [45*x for x in range(0,8)] # lon = list(np.linspace(113.8, 114.6, 8)) lat = list(np.linspace(22.4, 22.85, 8)) # wind = [2]*8 angle = [90]*8 # 为方便比较长度,箭头方向设置成同样 lon = [114.27] * 8 # 为方便比较长度,箭头经度设置成同样 # 指定地图范围、投影方式(projection)等 area_thresh是与湖泊等在地图上显示相关的参数 m = Basemap(llcrnrlon=113.7, llcrnrlat=22.35, urcrnrlon=114.7, urcrnrlat=22.9,\ rsphere=(6378137.00,6356752.3142),\ resolution='l', area_thresh=1000., projection='lcc', lat_1=22.5, lat_0=22.5, lon_0=114,ax=ax) lon, lat = m(*(lon, lat)) # 一系列的U、V ver = [-spd*math.sin(math.radians(agl)) for spd,agl in zip(wind, angle)] # U份量 hriz = [-spd*math.cos(math.radians(agl)) for spd,agl in zip(wind, angle)] # V份量 print(ver, '\n', hriz) ax=plt.gca() #下面两行是读取地图中的shape文件,即轮廓图 # m.readshapefile(r'G:\深圳季风研究\gadm36_HKG_shp\gadm36_HKG_0', 'states',color='grey') #HongKong # # m.readshapefile(r'G:\深圳季风研究\gadm36_CHN_shp\gadm36_CHN_3', 'states',color='grey') #Mainland in given lon and lat # m.readshapefile(r'G:\深圳季风研究\gadm36_sz_shp\Bon_data\xzq_sz_pop', 'states', color='grey') m.scatter(lon, lat, s=2, color='goldenrod', marker="o") #根据经纬度,画出对应站点位置 ax.set_title('风场') # ax.quiver(lon, lat, ver, hriz, units='width', scale=2, width=0.01, color='deepskyblue') ax.quiver(lon, lat, ver, hriz, color='deepskyblue', width=0.005, scale=30) for i, wspd in enumerate(wind): ax.annotate(str(wspd), (lon[i], lat[i])) # 在图上添加一些文字信息 plt.text(0.6,0.9, r'$mean: $'+str(18) + '°', color='forestgreen',transform=ax.transAxes, fontweight='extra bold') plt.text(1.02,0.6, r'$S: $' + str(18) + '%', color='forestgreen',transform=ax.transAxes, fontweight='heavy') plt.text(1.02,0.4, r'$N: $', color='forestgreen',transform=ax.transAxes, fontweight=100) # 画经纬度网格 m.drawmeridians([114.0,114.4], labels=[1,0,0,1]) # meridian:子午线,经线 arange指明范围和间隔 m.drawparallels(np.arange(15, 30, 0.3), labels=[1,0,0,0]) # 画纬度平行线 # 比例尺长度的U、V值和位置 q_lon, q_lat = m(*(114.27, 22.75)) spd = 2 angle_all = 90 ver_all = -spd*math.sin(math.radians(angle_all)) hriz_all = -spd*math.cos(math.radians(angle_all)) # ax.quiver(q_lon, q_lat, ver_all, hriz_all, color='g', pivot='mid') # mid是旋转枢纽在中间,默认在尾部 ax.quiver(q_lon, q_lat, ver_all, hriz_all, color='g', scale=30) # 画比例尺 plt.text(0.82,0.1, r'$scale:$', color='r',transform=ax.transAxes, fontweight=100, fontsize=8) plt.text(0.82,0.03, r'$2m/s$', color='r',transform=ax.transAxes, fontweight=100, fontsize=8) plt.quiver(95000, 3000, 3, hriz_all, color='r', width=0.005, scale=50) print(-ver_all, hriz_all) # 这一段与画箭头不相干,可忽略注释掉 画散点,为不一样散点设置不一样颜色 # Colors=('#DDDDFF','#7D7DFF','#0000C6','#000079','#CEFFCE','#28FF28','#007500','#FFFF93') # sc = plt.scatter(lon, lat, s=100, color=Colors, marker="o") #根据经纬度,画出对应站点位置 # for i,txt in enumerate(Colors): # ax.annotate(txt,(lon[i],lat[i]), fontsize=5) plt.show()
下面是代码运行结果:
未读入shape文件的结果:
读入了shape文件的结果
quiver(*args, **kw)
*args, **kw分别是可变参数和关键字参数,参考此文总结以下: