ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:21.18KB ,
资源ID:10395146      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10395146.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Python自学笔记Matplotlib风羽自定义.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Python自学笔记Matplotlib风羽自定义.docx

1、Python自学笔记Matplotlib风羽自定义Python自学笔记Matplotlib风羽自定义Python自学笔记Matplotlib风羽自定义 对于气象专业的小学生来说,风场是预报重要的参考数据,我们所知的风羽有四种:短线代表风速2m/s,长线代表风速4m/s,空心三角代表风速20m/s,实心三角代表风速50m/s。而matplotlib的风羽只有短线、长线、三角三种,而这里的三角不分空心实心,但是可通过改变风羽颜色为白色使三角变为空心形状,虽然这三种可以自定义各自代表的风速,但是仍与我们的使用习惯不符,即使把三角设成20m/s,原本一个实心三角就能表示的50m/s的风在matplot

2、lib中需要两个三角外加两条长线一条短线。为了迎合预报员的需求,我在研究了matplotlib的风场函数barbs()的源代码quiver.py文件后,对quiver.py做了适当的调整,使得matplotlib也有了空心三角和实心三角之分。 一、函数barbs的使用 barb(X, Y, U, V, *kw) X:风场数据X坐标 Y:风场数据Y坐标 U:风的水平方向分量 V:风的垂直方向分量 Demonstration of wind barb plots import matplotlib.pyplot as plt import numpy as np x = np.linspace(-

3、5, 5, 5) X, Y = np.meshgrid(x, x) U, V = 12*X, 12*Y data = (-1.5, .5, -6, -6),(1, -1, -46, 46),(-3, -1, 11, -11),(1, 1.5, 80, 80),(0.5, 0.25, 25, 15),(-1.5, -0.5, -5, 40) data = np.array(data, dtype=(x, np.float32), (y, np.float32), (u, np.float32), (v, np.float32) # Default parameters, uniform grid

4、 ax = plt.subplot(2, 2, 1) ax.barbs(X, Y, U, V) # Arbitrary set of vectors, make them longer and change the pivot point #(point around which theyre rotated) to be the middle ax = plt.subplot(2, 2, 2) ax.barbs(datax, datay, datau, datav, length=8, pivot=middle) # Showing colormapping with uniform gri

5、d. Fill the circle for an empty barb, # dont round the values, and change some of the size parameters ax = plt.subplot(2, 2, 3) ax.barbs(X, Y, U, V, np.sqrt(U*U + V*V), fill_empty=True, rounding=False,sizes=dict(emptybarb=0.25, spacing=0.2, height=0.3) # Change colors as well as the increments for p

6、arts of the barbs ax = plt.subplot(2, 2, 4) ax.barbs(datax, datay, datau, datav, flagcolor=r,barbcolor=b, g, barb_increments=dict(half=10, full=20, flag=100),flip_barb=True) plt.show() 二、源代码解读 1.class Barbs() class Barbs(mcollections.PolyCollection): docstring.interpd def _init_(self, ax, *args, *kw

7、): . def _find_tails(self, mag, rounding=True, half=5, full=10, flag=50): . def _make_barbs(self, u, v, nflags, nbarbs, half_barb, empty_flag, length,pivot, sizes, fill_empty, flip): . def set_UVC(self, U, V, C=None): . def set_offsets(self, xy): . 通过读源代码可知类Barbs有五个方法分别为_init_、_find_tails、_make_barb

8、s、set_UVC、set_offsets。 2._init_ docstring.interpd def _init_(self, ax, *args, *kw): The constructor takes one required argument, an Axes instance, followed by the args and kwargs described by the following pylab interface documentation: %(barbs_doc)s self._pivot = kw.pop(pivot, tip) self._length = k

9、w.pop(length, 7) barbcolor = kw.pop(barbcolor, None) flagcolor = kw.pop(flagcolor, None) self.sizes = kw.pop(sizes, dict() self.fill_empty = kw.pop(fill_empty, False) self.barb_increments = kw.pop(barb_increments, dict() self.rounding = kw.pop(rounding, True) self.flip = kw.pop(flip_barb, False) tra

10、nsform = kw.pop(transform, ax.transData) # Flagcolor and and barbcolor provide convenience parameters for # setting the facecolor and edgecolor, respectively, of the barb # polygon. We also work here to make the flag the same color as the # rest of the barb by default if None in (barbcolor, flagcolo

11、r): kwedgecolors = face if flagcolor: kwfacecolors = flagcolor elif barbcolor: kwfacecolors = barbcolor else: # Set to facecolor passed in or default to black kw.setdefault(facecolors, k) else: kwedgecolors = barbcolor kwfacecolors = flagcolor # Parse out the data arrays from the various configurati

12、ons supported x, y, u, v, c = _parse_args(*args) self.x = x self.y = y xy = np.hstack(x:, np.newaxis, y:, np.newaxis) # Make a collection barb_size = self._length * 2 / 4 # Empirically determined mcollections.PolyCollection._init_(self, , (barb_size,), offsets=xy, transOffset=transform, *kw) self.se

13、t_transform(transforms.IdentityTransform() self.set_UVC(u, v, c) _init_()方法为初始化方法,此方法中flagcolor、barbcolor为设置风羽颜色的关键字,中间的说明文字提示颜色设置是针对所有的风羽的,所以通过颜色设置达不到风羽中既有空心白色三角又有实心黑色三角。初始化方法中在对一些参数进行了初始化赋值后执行了set_UVC()方法,所以我们顺着这个set_UVC()方法往下继续读。 3.set_UVC() def set_UVC(self, U, V, C=None): self.u = ma.masked_inv

14、alid(U, copy=False).ravel() self.v = ma.masked_invalid(V, copy=False).ravel() if C is not None: c = ma.masked_invalid(C, copy=False).ravel() x, y, u, v, c = delete_masked_points(self.x.ravel(), self.y.ravel(), self.u, self.v, c) else: x, y, u, v = delete_masked_points(self.x.ravel(), self.y.ravel(),

15、 self.u, self.v) magnitude = np.hypot(u, v) flags, emptyflags,barbs, halves, empty = self._find_tails(magnitude, self.rounding, *self.barb_increments) # Get the vertices for each of the barbs plot_barbs = self._make_barbs(u, v, flags, emptyflags,barbs, halves, empty, self._length, self._pivot, self.

16、sizes, self.fill_empty, self.flip) self.set_verts(plot_barbs) # Set the color array if C is not None: self.set_array(c) # Update the offsets in case the masked data changed xy = np.hstack(x:, np.newaxis, y:, np.newaxis) self._offsets = xy self.stale = True 在此方法中,首先进行了变量的命名赋值,然后依次执行了方法_find_tails和_ma

17、ke_barbs。_make_barbs的输入为_find_tails的输出,_find_tails的输入中有一个为magnitude = np.hypot(u, v),np.hypot()为勾股定理方法,因此可知magnitude为风速。 4._find_tails def _find_tails(self, mag, rounding=True, half=5, full=10, flag=50): Find how many of each of the tail pieces is necessary. Flag specifies the increment for a flag,

18、barb for a full barb, and half for half a barb. Mag should be the magnitude of a vector (i.e., = 0). This returns a tuple of: (*number of flags*, *number of barbs*, *half_flag*, *empty_flag*) *half_flag* is a boolean whether half of a barb is needed, since there should only ever be one half on a giv

19、en barb. *empty_flag* flag is an array of flags to easily tell if a barb is empty (too low to plot any barbs/flags. # If rounding, round to the nearest multiple of half, the smallest # increment if rounding: mag = half * (mag / half + 0.5).astype(np.int) num_flags = np.floor(mag / flag).astype(np.in

20、t) mag = np.mod(mag, flag) num_barb = np.floor(mag / full).astype(np.int) mag = np.mod(mag, full) half_flag = mag = half empty_flag = (half_flag | (num_flags 0) | (num_emptyflags 0) |(num_barb 0) return num_flags,num_barb, half_flag, empty_flag 通过读此方法的说明文档可知,此方法作用为根据输入的风速、设置的短线长线三角的数值计算并返回三角、长线、短线的个

21、数以及有没有无风的情况。 5._make_barbs def _make_barbs(self, u, v, nflags, nbarbs, half_barb, empty_flag, length, pivot, sizes, fill_empty, flip): This function actually creates the wind barbs. *u* and *v* are components of the vector in the *x* and *y* directions, respectively. *nflags*, *nbarbs*, and *half_ba

22、rb*, empty_flag* are, *respectively, the number of flags, number of barbs, flag for *half a barb, and flag for empty barb, ostensibly obtained *from :meth:_find_tails. *length* is the length of the barb staff in points. *pivot* specifies the point on the barb around which the entire barb should be r

23、otated. Right now, valid options are head and middle. *sizes* is a dictionary of coefficients specifying the ratio of a given feature to the length of the barb. These features include: - *spacing*: space between features (flags, full/half barbs) - *height*: distance from shaft of top of a flag or fu

24、ll barb - *width* - width of a flag, twice the width of a full barb - *emptybarb* - radius of the circle used for low magnitudes *fill_empty* specifies whether the circle representing an empty barb should be filled or not (this changes the drawing of the polygon). *flip* is a flag indicating whether

25、 the features should be flipped to the other side of the barb (useful for winds in the southern hemisphere. This function returns list of arrays of vertices, defining a polygon for each of the wind barbs. These polygons have been rotated to properly align with the vector direction. # These control t

26、he spacing and size of barb elements relative to the # length of the shaft spacing = length * sizes.get(spacing, 0.125) full_height = length * sizes.get(height, 0.4) full_width = length * sizes.get(width, 0.25) empty_rad = length * sizes.get(emptybarb, 0.15) # Controls y point where to pivot the bar

27、b. pivot_points = dict(tip=0.0, middle=-length / 2.) # Check for flip if flip: full_height = -full_height endx = 0.0 endy = pivot_pointspivot.lower() # Get the appropriate angle for the vector components. The offset is # due to the way the barb is initially drawn, going down the y-axis. # This makes

28、 sense in a meteorological mode of thinking since there 0 # degrees corresponds to north (the y-axis traditionally) angles = -(ma.arctan2(v, u) + np.pi / 2) # Used for low magnitude. We just get the vertices, so if we make it # out here, it can be reused. The center set here should put the # center

29、of the circle at the location(offset), rather than at the # same point as the barb pivot; this seems more sensible. circ = CirclePolygon(0, 0), radius=empty_rad).get_verts() if fill_empty: empty_barb = circ else: # If we dont want the empty one filled, we make a degenerate # polygon that wraps back

30、over itself empty_barb = np.concatenate(circ, circ:-1) barb_list = for index, angle in np.ndenumerate(angles): # If the vector magnitude is too weak to draw anything, plot an # empty circle instead if empty_flagindex: # We can skip the transform since the circle has no preferred # orientation barb_l

31、ist.append(empty_barb) continue poly_verts = (endx, endy) offset = length # Add vertices for each flag for i in range(nflagsindex): # The spacing that works for the barbs is a little to much for # the flags, but this only occurs when we have more than 1 # flag. if offset != length: offset += spacing / 2. poly

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1