文章目录
- 1.双坐标 twinx()
- 2.上下子图共用横坐标
- 3.Cartopy实用命令——add_cyclic_point
- 4.风杆绘制
- 5.台风符号
- 6.Colorbar一些参数
- 7. plt.text()位置
- 8. plt.subplots_adjust()调整间距
- 9. matplotlib plt.show 阻塞程序
- 10. 自定义色带
- 11. 色带按某个值平分两半
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为经纬度和值,需事先计算好