笔记:python 绘图进阶

参考:气象学家公众号
持续更新中…

1.双坐标 twinx()

fig=plt.figure(figsize=(7,4),dpi=200)
ax1=fig.add_subplot(111)
ax2=ax1.twinx()
line2,=ax2.plot(times,pressures,'k-',lw=1.2,label='气压')
plt.show()

2.上下子图共用横坐标

fig,((ax1),(ax2))=plt.subplots(2,1,figsize=(5,5),dpi=200,sharex='all') #sharex='all'命令,这是令两幅子图共享x轴
fig.subplots_adjust(hspace=0) # 上下间距等于0
plt.show()

3.Cartopy实用命令——add_cyclic_point

nc数据存储格点问题导致0°或者180°出现空白情况,解决方法:

from cartopy.util import add_cyclic_point
cycle_sst, cycle_lon = add_cyclic_point(sst, coord=lon)#sst为空间分布图所用变量
cycle_LON, cycle_LAT = np.meshgrid(cycle_lon, lat)
ax.contourf(cycle_LON, cycle_LAT, cycle_sst,levels=np.arange(-10,35),cmap='RdBu_r')

4.风杆绘制

直接使用plt.barbs(lon,lat,u,v,zorder=5)会出现问题,因为关于风羽的风速,ax.barbs()中当风速在**(0,2.5)时,认为无风画一圆圈,在(2.5,7.5)**为一短杆,因此需改成

plt.barbs(lon,lat,u,v,barb_increments={'half':2,'full':4,'flag':20},zorder=1) # zorder图层上下叠放位置,值越大越在上层

barb_increments={‘half’:2,‘full’:4,‘flag’:20},修改风矢杆长短杆线和三角分别代表的风速大小。注意:单位与u v数据一致(0,1)认为无风画⚪,(1,3)一短杆,(3,5)一长杆
国外:长杆代表风向,短杆代表风速,每个短杆为10knots,如果是半个短杆,则为5knots(1knot=1节=0.514m/s)
国内:长杆代表风向,短杆代表风速,每个短杆为4m/s,如果是半个短杆,则为2m/s。(1m/s=1.94knots)

5.台风符号

在将cartopy官网例子本土化的过程中,matplotlib的marker中没有现成的台风符号,解决方案:
方案一:通过数字6和9的叠加来产生台风符号

ax.scatter(x,y2,s=200,marker='$6$',color='crimson')
ax.scatter(x,y3,s=200,marker='$9$',color='crimson')

方案二:通过自定义台风符号来绘制

def get_hurricane():
    u = np.array([  [2.444,7.553],
                    [0.513,7.046],
                    [-1.243,5.433],
                    [-2.353,2.975],
                    [-2.578,0.092],
                    [-2.075,-1.795],
                    [-0.336,-2.870],
                    [2.609,-2.016]  ])
    u[:,0] -= 0.098
    codes = [1] + [2]*(len(u)-2) + [2] 
    u = np.append(u, -u[::-1], axis=0)
    codes += codes

    return mpath.Path(3*u, codes, closed=False)
hurricane = get_hurricane()
ax.scatter(x,y1, s=350, marker=hurricane, 
            edgecolors="crimson", facecolors='none', linewidth=3)

6.Colorbar一些参数

参数介绍
ax代表需要传入色条的ax
shrink色条相对长度
orientation=‘horizontal’代表色条横向还是竖向,vertical代表垂直;horizontal代表水平
cax色条绝对位置
pad色条和子图ax之间距离
extend = ‘neither’色条两头是否为尖,默认neither。both表示两头尖,min表示数值小的那头尖,max表示数值大的那头尖
ticks默认根据你的ax里的间距大小自动分配,可以用列表自定义间距
format控制刻度样式,如‘%.3f’表示保留三位小数

7. plt.text()位置

plt.text(x,y,s)默认x、y为绝对位置,即xy轴上的坐标;加入transform=ax.transAxes可使位置参数转为相对位置

import matplotlib.pyplot as plt
ax = plt.subplot(111)
plt.text(0.02, 0.95, text, transform=ax.transAxes)

8. plt.subplots_adjust()调整间距

plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=0.5) #调整间距

9. matplotlib plt.show 阻塞程序

matplotlib画图有两种模式:block 模式和 interactive 模式

默认情况下python会采用block模式,但是使用ipython时会采用interactive模式.
block模式
block模式下调用plt.plot()等绘图函数并不会直接画图,而是将图保存在内存中,等到调用plt.show()时才会把内存中的数据画出来

当plt.show把图绘制完成,会阻塞主程序,后面代码需要手动关闭窗口之后才会继续执行
interactive模式

在绘图之前,使用plt.ion()可以开启interactive模式,使用plt.ioff()关闭interactive模式

开启这个模式之后,调用plt.plot()等绘图函数会直接显示图像,然后立刻关闭窗口,由于没有等待时间,窗口会一闪而过,此时可以调用plt.pause(time)增加等待时间

如果程序中包含多个plt.pause(), 那么之前的绘图窗口不会关闭,而是会等到最后一个plt.pause()结束后一起关闭

该模式下,plt.show()是无效的

可以考虑在绘图之前开启interactive, 绘图结束后关闭interactive, 最后调用plt.show()

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,100,0.1)
y = x**2
z = x**3+5

plt.plot(x,y)
plt.show()      #绘制第一个图后阻塞程序

plt.plot(x,z)
plt.show()      #需要手动关闭第一个窗口才会绘制
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,10,0.1)
y = x**2
z = x**3+5

plt.ion() #开启interactive mode

plt.figure(1)
plt.plot(x,y)   #立即绘制图像1
plt.pause(2)    #等待2s但是不会关闭图像1

plt.figure(2)   
plt.plot(x,z)   #立即绘制图像2
plt.pause(2)    #等待2s关闭图像1,2

plt.ioff()      #关闭interactive mode
plt.show()      #显示图像1,2并且阻塞程序

总结:plt.show()放置最后即可同时显示多窗口

10. 自定义色带

import matplotlib.colors as colors
import matplotlib.pyplot as plt
rain_colors = ['#FFFFFF', '#A6F28F', '#38A800', '#61B8FF', '#0000FF', '#FA00FA', '#730000', '#400000'] #自定义颜色
cmaps_pre = colors.LinearSegmentedColormap.from_list('mycmap', rain_colors, N=100)#创建色带
pic = plt.contourf(olon, olat, oz, cmap=cmaps_pre)#绘图 olon, olat, oz为经纬度和值,需事先计算好

11. 色带按某个值平分两半

import matplotlib.colors as colors
import matplotlib.pyplot as plt
rain_anomaly = ['#FE130C', '#FF8C00', '#FFFF00', '#FFFFE0', '#EFFF2D', '#50CA4B', '#48CBA1', '#069CEE', '#80419D'] # 降水距平色带颜色
cmaps_pre_anomaly = colors.LinearSegmentedColormap.from_list('mycmap', rain_anomaly)  # 创建降水距平百分率色带
norm = colors.TwoSlopeNorm(vmin=np.min(oz), vcenter=0, vmax=np.max(oz)) #按0平分降水距平色带
pic = plt.contourf(olon, olat, oz, v, cmap=cmaps_pre_anomaly, norm=norm)#绘图 olon, olat, oz为经纬度和值,需事先计算好
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值