matplotlib.pyplot
设置全局字体
plt.rcParams['font.family'] = 'Times New Roman',
用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
正常显示负号
plt.rcParams['axes.unicode_minus'] = False
设置画布大小,子图一行一列第一个
fig=plt.figure(figsize=(10,6)
ax=fig.add_subplot(111)
设置左轴的颜色
ax.spines['left'].set_color ('r')
设置y轴ticklabel颜色,外凸,字体大小,y轴标签颜色
ax.tick_params( axis='y',direction='out', colors='red',
which='major',
direction='out',
length=5,
width=0.59,
pad=5,
labelsize=14,
bottom=True, left=True, right=True, top=True
labelcolor='r', labelsize=10)
设置y轴标签显示范围以及间隔
ax.set_yticks(range(160, 320, 20))
共享x轴
ax2 = ax.twinx()
反转y轴
ax.invert_yaxis()
设置x轴的范围
ax.set_xlim(20,32)
为图片添加标题,并设置标题字体大小,位置,离y轴的距离
ax.set_title('units:mm/day',fontsize=14, loc='right',pad=12)
- 保存图片,设置分辨率,保存图片类型
fig.savefig('my-plot-name.png',format='png',dpi=150)
自定义x轴标签,并且使得x、y范围的lim,
mon=np.arange(1,13,1)
m=np.array(['01-01','03-01','05-01','07-01','09-01','11-01','12-31'])
fig=plt.figure(figsize=(10,8),dpi=150)
ax=fig.add_subplot(111)
ax.plot(mon,rmse2017*100)
ax.set_xlim(1,12)
ax.set_xticks(np.linspace(1, 12,7))
ax.set_ylim(-5,26)
m=np.array(['01-01','03-01','05-01','07-01','09-01','11-01','12-31'])
ax.set_xticklabels(m)
ax.tick_params(which='major',direction='in', pad=10,labelsize=15,axis='both',bottom=True, left=True, right=False, top=False)
ax.set_ylabel('Rmse/ cm',fontsize=20)
ax.set_xlabel('month/day',fontsize=20)
ax.set_ylim(0.1,0.31)
使得图像右边和上边没有颜色
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
使得colorbar放置在图片最下方,并且设置colorbar的字体大小以及放置方向、保存文件的格式
ax=fig.add_axes([0.25,0.05,0.5,0.015])
cb=fig.colorbar(plot,cax=ax,shrink=0.9,orientation='horizontal',pad=0.04,aspect=10)
cb.ax.tick_params(labelsize=10)
fig.savefig(r'sla_2017_month.png',format='png')
修改坐标刻度上的数字字体 -只有一幅图的情况
plt.yticks(fontproperties='Times NewRoman',size=16)
修改坐标刻度上的数字 -有多幅图的情况
ax.set_yticks(np.arange(lowlat+1,upperlat+1),crs=ccrs.PlateCarree())
ylabels=ax.get_yticks()
ax.set_yticklabels(labels=ylabels,fontdict={'family':'Times NewRoman','size':16})
设置colorbar的单位及字体大小\colorbar的一些细节操作,
cb.ax.tick_params(labelsize=16) #设置色标刻度字体大小。
font = {'family' : 'serif',
'color' : 'darkred',
'weight' : 'normal',
'size' : 16,
}
cb.set_label('colorbar',fontdict=font) #设置colorbar的标签字体及其大小
cb=fig.colorbar(conf,shrink=1,pad=0.04,aspect=19,
)
cb.ax.tick_params(which='both', direction='in', labelsize=14)
cb.ax.set_title('$m/s$',fontsize=14)
设置子图之间的距离
fig.tight_layout()
plt.subplots_adjust(wspace =0.4, hspace =0.05)
带横坐标为经度,带有经度单位
ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label =False))
边框的设置
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1,10,1)
x = np.arange(1,10,1)
plt.plot(x,y)
#matplotlin.pyplot.grid(b, which, axis, color, linestyle, linewidth, **kwargs)axis轴线、color颜色、linestyle的类型, linewidth的宽度,
plt.grid( color = 'black',linestyle='-.',linewidth = 2)
设置边框的粗细、颜色,网格线的颜色、线的类型,线的粗细
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1,10,1)
x = np.arange(1,10,1)
bwith = 2 #边框宽度设置为2
ax = plt.gca()#获取边框
ax.spines['top'].set_color('red') # 设置上‘脊梁’为红色
ax.spines['right'].set_color('none') # 设置上‘脊梁’为无色
ax.spines['bottom'].set_linewidth(bwith)
ax.spines['left'].set_linewidth(bwith)
ax.spines['top'].set_linewidth(bwith)
ax.spines['right'].set_linewidth(bwith)
plt.grid( color = 'black',linestyle='-.',linewidth = 1)
plt.plot(x,y)
axs = plt.gca()
axs.spines['right'].set_linewidth(1)
axs.spines['left'].set_linewidth(1)
axs.spines['top'].set_linewidth(1)
axs.spines['bottom'].set_linewidth(1)
ax.set_xticks(np.arange(box[0],box[1]+xstep, xstep))
ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label =False))
ax.invert_yaxis()
ax.tick_params(which='major',
direction='out',
length=6,
width=0.99,
pad=5,
labelsize=14,
bottom=True, left=True, right=True, top=True)
ax.tick_params(which='minor',
direction='out',
width=0.99,
labelsize=14,
bottom=True, left=True, right=True, top=True)
# 设置四个边框轴的多个边,加粗
ax4.spines[['right','left','top','bottom']].set_linewidth(1)
# 设置colorbar色条外面的框的粗细
cb.outline.set_linewidth(0.8)
# 在有投影的情况下,改粗细
ax.spines[['right','left','top','bottom']].set_linewidth(1.5)
ax.spines[['right','left','top','bottom']].set_visible(True)
坐标轴消失
ax.set_xticks([])
坐标轴的标签不显示
ax.yaxis.set_ticklabels([])
坐标系设置-缩放、对数坐标
#设置y轴坐标系的缩放比例为高度层的形式
ax.set_yscale("symlog")
自定义colorbar
import cmaps
from matplotlib.colors import ListedColormap
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.cm as cm
import matplotlib.colors as mcolors
# rgb=(
# [ 43,67,255],
# [ 91,130,255],
# [ 255,255,255],
# [ 255,255,255],
# [ 255,190,190],
# [ 255,142,142],
# [ 255,122,122],
# [ 255,97,97],
# [ 255,49,49],
# )
rgb=(
[0,0,255],
[39,39,255],
[78,78,255],
[91,118,255],
[118,130,255],
[ 255,255,255],
[ 255,255,255],
[ 255,190,190],
[ 255,142,142],
[ 255,122,122],
[ 255,99,99],
[ 255,58,58],
[ 248,19,8],
[ 153,33,20],
)
rgb=np.array(rgb)/255.0
newcmap=ListedColormap(rgb)
bins = [-600,-500,-400,-300,-200,-100,0,100,200,300,400,500,600,800,1000]
nbin = len(bins) - 1
cmap = cm.get_cmap('bwr', nbin)
norm4 = mcolors.BoundaryNorm(bins, nbin)
im4 = cm.ScalarMappable(norm=norm4, cmap=newcmap)
fig=plt.figure(figsize=(10,10),dpi=250)
ax=fig.add_axes()
cbar4 = fig.colorbar(
im4, cax=ax, orientation='horizontal',
)
ax2=cbar4.ax
ax2.xaxis.set_ticks_position('top') #将数值刻度移动到上边
ax2.tick_params(which='major',direction='in',
labelsize=10,top=True,width=1,length=28)
ax2.spines['top'].set_linewidth(5)
ax2.set_title('colormap',fontsize=15,
fontname="Times New Roman",
fontweight="bold" )
proplot
1、创建画板,非投影转换
f, axs = pplt.subplots( ncols=1, nrows=1,
yreverse=True,
share =1,
figsize=(8,6)
)
创建一个1x1的子图
ncols代表列
nrows代表行
yreverse=True 表示翻转y轴,与matplotlib.pyplot中的ax.invert_yaxis()作用相同
share=1,2,3,4,False 表示共享横轴、纵轴、colorbar、标题等信息,False表示不共享
figsize :设置画板的大小,可以根据需要设置,不添加的话是系统默认的格式
2、创建画板,含投影
f, ax = pplt.subplots( ncols=1, nrows=1,
axwidth=5,
refwidth=2,
suptitle='subplot ',
# figsize=(5,4),
proj='cyl',
proj_kw={'lon_0': 180}, lonlim=(100, 200),
latlim=(-20, 20),
share=4,
)
与matplotlib.pyplot的创建方式的区别,投影可以直接在创建画板时设置。
axwidth :调节画板的清晰度,可能,没怎么用过
refwidth: 各子图的长宽比
suptitle:各子图的总标题
proj='cyl', 设置为等间距投影
proj_kw={'lon_0': 180}, lonlim=(100, 200),
latlim=(-20, 20),
表示设置中心经度为180°,地图的经度范围是:100E-200E,
纬度范围是:-20S-20N
3、填色图的命令
m=ax.contourf(lon,lat,pre,
colorbar='l',
cmap = cmap,
extend='both',
colors=[ 'blue9','blue6','blue4', 'blue2','blue0',
'white','white',
'yellow3','yellow6', 'orange7', 'red8','red9'
],
colorbar_kw={'label': '',
'lw':0.5},
levels = np.linspace(-30,30,31)
)
基本的命令和matplot.pyplot类似,多了一些额外的功能
colorbar='l' :设置colorbar的显示位置,可以直接在contourf()里面设置了
extend='both':设置色标两边的范围为延申形式,没有定死
lw=0.7 :如果是绘制等值线的话,可以控制线的粗细
colors=[ 'blue9','blue6','blue4', 'blue2','blue0',
'white','white',
'yellow3','yellow6', 'orange7', 'red8','red9'
], 可以自己构建cmap,用colors就不需要使用cmap了
colorbar_kw={'label': '',
'lw':0.5}, 设置colorbar的label以及线的宽度
4、带有投影的基本细节属性
ax.format( title='TD-type disturbance structure ',
titleloc='l',
rtitle='Level:850(hPa)',
xformatter=LongitudeFormatter(),
xlim=(100,200),
xlabel='lon',
coast=True,
labels=True,
grid=True,
gridlinewidth=0.5,gridalpha=0.2,
lonlines=20,
latlines=10,
rc_kw={'tick.pad': 8}
)
title='TD-type disturbance structure ', 设置图的标题,标题的位置
titleloc='l',
rtitle='Level:850(hPa)', :设置图右边的标题,
ltitle='850(hPa)' : 左边的标题同理
xformatter=LongitudeFormatter(), :设置x轴的ticklabel为经度的形式
xlim=(100,200), 设置x轴经度显示的范围
xlabel='lon', 设置x轴的标签,为:lon
coast=True, 打开海岸线
labels=True, 打开x轴和y轴的刻度
grid=True, 打开网格线
gridlinewidth=0.5, 设置网格线的宽度
gridalpha=0.2, 设置网格线的透明度
lonlines=20, 设置经度的显示间距
latlines=10, 设置纬度的显示间距
rc_kw={'tick.pad': 8} 设置ticklabel距离tick的间距,但是在投影的图里好像不起作用
5、没有投影的基本细节属性,普通绘图的基本属性
axs.format( title='V(m/s) ',
titleloc='l',
rtitle='Level:950-200(hPa)',
xformatter=LongitudeFormatter(),
xlim=(100,210),
xlabel='',
yticks=pplt.arange(0,40,1),
grid=True,
xticks=10, ## x 间隔
xtickminor=True, xgridminor=True,
ytickminor=False, ygridminor=True,
rc_kw={'geogrid.alpha':0.3},
xticks=pplt.arange(0,40,4),
fontsize=20,
xlocator=1, xminorlocator=0.5,
xrotation=20,
yticks=[950, 800,600,500,400,300, 200],
yscale='symlog',
)
与带投影的起始差不了太多,主要就是关于经纬度坐标的设置有些差别
xticks=10, ## 设置x轴ticklabel的间隔
xtickminor=True, xgridminor=True, 打开x轴的ticklabel的最小值,以及网格线的最小值
ytickminor=False, ygridminor=True, 这个是设置y轴的
rc_kw={'geogrid.alpha':0.3} 设置网格线的透明度
xticks=pplt.arange(0,40,4), 设置x轴tick的具体范围
fontsize=20, 字体的大小
xrotation=20, xticklabel的旋转的角度
yticks=[] 设置yticks的具体显示数值
yscale='symlog', 设置y轴的缩放形式,一般画垂向分布的时候用
6、绘制普通折线图plot
ax.plot(x,y,label='dpdy',legend='ur')
label='dpdy', 设置y轴的坐标
legend='ur' 设置图例在右上方,在绘图的时候可以直接设置,
7、一些其他小技巧
ax.axvline(x=18, color='grey', linewidth=1.5,linestyle='-.')
绘制一条垂直线, 颜色为灰色,lw表示线的宽度,ls为线的风格
ax.axhline(y=0, color='grey', linewidth=1.5,linestyle='--')
绘制一条水平线,
ox = ax.alty(color='blue8', linewidth=1)
lns2=ox.plot(x,dm2,color='blue8',
label=r'$-V \cdot \nabla P$')
共用x轴,绘制一条折线
ox2 = ax.twinx( yloc=('axes', 1.05), color='green4', linewidth=1)
lns3=ox2.plot(x,dm3*10**11,color='green4',
label=r'$-\omega \frac{\partial P}{\partial p}$',)
还是共享x轴绘制一条折线,但是这个y轴不在图上
lns = lns1+lns2+lns3+lns4
labs = [l.get_label() for l in lns]
ax.legend(lns, labs,loc='ul',ncols=2, center=False, frame=True)
将共享同一条x轴的折线的y轴的图例画在同一个框内,不然就是四个不同的图例了
ax.bar(x,datay.T*10**11,
0.2,
cycle=['c','blue','red6'],
label=['MRG','TD','TC'],
edgecolor='grey',
legend='ul',
colorbar_kw={'frameon': False}
color=np.where(y>0,'tomato','tab:blue'), #判断大于0的为红色,负的为蓝色
)
将三个不同的数据的柱形图画在同一个子图上,
三个柱形图的颜色不同,名称也不同,图例的位置为左上角
ax.text(9,0.85,'MRG',bbox=True,bordercolor='w',
borderstyle='miter',
bboxcolor='w',
bboxstyle='square', bboxalpha=0.5, )
在图上添加text ,设置边缘颜色等
axs[i,j].scatter(lon_center[i,j],875,marker='v',
markersize=150,
c='red9',
alpha=0.8,
zorder=2)
绘制散度图的一些命令
ax.format()
可以用来设置全局的坐标属性等,如果存在子图的画,也可以指定某个子图设置属性
8、循环绘制多子图(带有投影)
proj = pplt.Proj('cyl',lon_0=180,)
f, axs = pplt.subplots( ncols=2, nrows=tstep,
figsize=(8,9),
# refwidth=1.5,
fontsize=14,
proj=proj,
fontname= 'Times New Roman',
)
step = 5
for i in range(tstep):
for j in range(2):
print(i,j)
# norm = pplt.Norm('diverging')
m=axs[i,j].contourf(lon, lat, pre[i,j], cmap=cmap,extend='both',
levels=np.arange(-30,31),
zorder=1,
labels=False)
axs[i,j].format(title=time[i,j],titleloc='l',
coast=True,
lonlim=(100, 199),
latlim=(-16, 16),
# fontsize=14,
tickdir='in',
fontname= 'Times New Roman',
labelpad=7, #调节xytick的与轴的距离
# gridalpha=0.15
metalinewidth=1, #设置轴的粗细
)
c2=pplt.scale_luminance('grey', 1)
axs[i,j].axhline(0, lw=1, ls='--', color=c2)
qiv=axs[i,j].quiver(x_u[::step,::step],y_u[::step,::step],
u[i,j][::step,::step],v[i,j][::step,::step]
,pivot='mid',\
width=0.002,scale=220,headlength=4,headwidth=4,
)
axs[:,0].format(latlabels=True,
# yformatter=LatitudeFormatter(),
latlines=10,rc_kw={'tick.labelsize':14})
axs[4,:].format(lonlabels=True,
# xformatter=LongitudeFormatter(zero_direction_label=True),
lonlines=20,rc_kw={'tick.labelsize':14})
f.colorbar(m,
loc='b',
label='',
ticks=[-30,-20,-10,0,10,20,30],
length=0.8,width=0.15,
labelsize=14,
)
plt.show()
合并打开多个nc文件的快速技巧
import xarray as xr
ds = xr.open_mfdataset('D:/ERA-Interim/divergence/*divergence.nc')
ds.to_netcdf(r'D:/ERA-Interim/divergence/divergence.nc')
快速绘图模板
lon-lat & level quickly plots
fig = plt.figure(figsize=(10,10),dpi=400)
ax_1 = plt.axes([0.09,0.52,0.4,0.33],projection=projection) # 左上
ax_2 = plt.axes([0.58,0.52,0.4,0.33],projection=projection) # 右上
ax_3 = plt.axes([0.09, 0.16, 0.4, 0.33],) # 左下
ax_4 = plt.axes([0.58,0.16,0.4,0.33]) # 右下
# cax = plt.axes([0.35,0.06, 0.4,0.015])
set_line(ax_1)
set_line(ax_2)
set_line(ax_3)
set_line(ax_4)
########################################################################
########################################################################
ax_3.plot(cont, level, linewidth=2, c='lightskyblue', linestyle="-", marker='o', markersize=2)
ax_3.axvline(x=0, ymin=0, ymax=100, color="k", linestyle="--")
ax_3.set_xlim(-4, 4)
ax_3.set_ylim(100, 1000)
ax_3.set_yticks([1000, 500,300, 200, 100])
ax_3.set_yticklabels(['1000','500','300','200','100'])
ax_3.invert_yaxis()
ax_3.set_title('(c) Cont', loc='left', fontsize=20, pad=8)
ax_3.set_title('U', loc='right', fontsize=20)
########################################################################
ax_4.plot(band,level,linewidth=2,
c='lightskyblue',linestyle="-",marker='o',markersize=2)
ax_4.set_ylim(1000,100)
ax_4.axvline(x=0,ymin=0,ymax=100, color="k", linestyle="--")
ax_4.invert_yaxis()
ax_4.set_xlim(-1,1)
ax_4.yaxis.set_ticklabels([])
ax_4.set_title('(d) No_BA',loc='left',fontsize=20,pad=8)
ax_4.set_title('U',loc='right',fontsize=20)
ax_4.yaxis.set_ticklabels([])
########################################################################
ax_1.contourf(lon,lat,cont_u[0],levels=17,cmap =cmaps.BlueWhiteOrangeRed,
transform=ccrs.PlateCarree())
ax_1.quiver(x_cont[::step,::step],y_cont[::step,::step],
cont_u[0][::step,::step],
cont_v[0][::step,::step], transform=ccrs.PlateCarree())
ax_1.set_extent(box,crs=ccrs.PlateCarree())
ax_1.set_xticks(np.arange(box[0],box[1], xstep),crs=ccrs.PlateCarree())
ax_1.set_yticks(np.arange(box[2], box[3], ystep),crs=ccrs.PlateCarree())
lon_formatter = LongitudeFormatter(zero_direction_label=False)#True/False
lat_formatter = LatitudeFormatter()
ax_1.xaxis.set_major_formatter(lon_formatter)
ax_1.yaxis.set_major_formatter(lat_formatter)
ax_1.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label =False))
ax_1.set_title('(a) Cont',loc='left',fontsize=20)
ax_1.set_title('850hpa U&V',loc='right',fontsize=20)
ax_1.tick_params(which='major',
direction='in',
length=3,
width=1,
pad=8,
labelsize=16,
bottom=True, left=True, right=True, top=True)
########################################################################
ax_2.contourf(lon,lat,band_u[0],levels=17,cmap =cmaps.BlueWhiteOrangeRed,
transform=ccrs.PlateCarree())
ax_2.quiver(x_band[::step,::step],y_band[::step,::step],
band_u[0][::step,::step],
band_v[0][::step,::step], transform=ccrs.PlateCarree())
ax_2.set_extent(box,crs=ccrs.PlateCarree())
ax_2.set_xticks(np.arange(box[0],box[1], xstep),crs=ccrs.PlateCarree())
ax_2.set_yticks(np.arange(box[2], box[3], ystep),crs=ccrs.PlateCarree())
ax_2.xaxis.set_major_formatter(lon_formatter)
ax_2.yaxis.set_major_formatter(lat_formatter)
ax_2.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label =False))
ax_2.set_title('(b) No_BA',loc='left',fontsize=20)
ax_2.set_title('850hpa U&V',loc='right',fontsize=20)
ax_2.tick_params(which='major',
direction='in',
length=3,
width=1,
pad=8,
labelsize=16,
bottom=True, left=True, right=True, top=True)
ax_2.yaxis.set_ticklabels([])
pandas库的一些使用教程
1、读取xlsx文件
- pd.read_excel(path)
- 在次之前你需要按照pandas 、openpxl 、xlrd
2、去掉nan值
df = pd.read_excel(path)
df = df.dropna()
3、取出符合条件的数据
df = df[(df['TEMP'] > -50) & (df['TEMP'] < 50)]
4、将时间为object格式的数据转换为datatime64
2016-01-24 23:00:00
- 下述命令还会生成一个新的columns名称为:datatime
df['datetime'] = pd.to_datetime(df['TIME'])
5、计算两个数据的直接的差值
-
diff(-1) : 使用当前时刻的值减去后一个时刻的值。
-
直接diff(),是计算当前时刻与前一个时刻的差
df['temp_grad']=df['TEMP'].diff()
6、去掉某一列的所有值
df = df.drop(columns='temp_gradient')
7、找到符合条件的数据,对应的索引
index = np.where((df['TEMP'] < 4) & (df['temp_grad'] <=-10))
8、按照指定的一列进行分类
for name, group in df.groupby(['STNM']):
print(name,group)
Ai 快捷键学习
1、Ait + 鼠标滚轮
实现页面的放大和缩小
2、空格+鼠标左键
抓手工具
3、ctrl + r
调出标尺,可以通过标尺来对其图片
4、ctrl + ;
隐藏标尺
5、ctrl + ‘
调用网格标尺
再按一次就是取削
6、ctrl +shift+z
反向撤回
7、tab
快速全屏
8、ctsl+s / ctrl+shift+s
保存