Python可视化 | seaborn实现概率密度图

2021-05-28 16:41:46 浏览数 (1)

点击下方公众号,回复资料,收获惊喜

1、前言

seaborn是一款非常强大的画图工具,可以画很多种图,除了截图中展示的,下面还有很多,大家可以尝试一下其他的。今天我们用的只是其中一个:distplot。

2、画图

前面的数据准备和提取工作,跟前一篇趋势图一样,我们直接从画图开始。

代码:

代码语言:javascript复制
path1 =r"remapbiled_tas_yearly_EC-Earth3_ssp126_r1i1p1f1_gr_201501-210012.nc"
cmip6 = xarray.open_dataset(path1).tas.loc["2005":"2015",:,:]
fig = plt.figure(figsize=(3,3),dpi=60)#画布
ax = fig.add_axes([1,1,1.5,1.5])#画层
sns.distplot(cmip6,#数据                 
           color='red',#概率密度线的颜色
           ax=ax,
           label="tas-temp",#蓝色线条的名称
           )

这样,最简单的PDFs就画好了,横坐标是nc文件中对应的温度值,纵坐标为概率,但是这个图太丑了,实在拿不出手,所以接下来美化一下。

当增加参数kde = True时,图片没有变化,kde表示是否绘制高斯核密度估计值,默认是Ture,如果为False,则图中的曲线就消失了,且纵坐标发生了变化,请注意看效果。

而我们想保留曲线,把下面的直方图去掉,需要添加调整参数:kde = True,同时添加参数hist=False,代码变成如下:

代码语言:javascript复制
sns.distplot(cmip6,#数据                 
           color='red',#概率密度线的颜色
           ax=ax,
           label="tas-temp",#蓝色线条的名称
           kde=True,
           hist=False
           )

效果:

然后,我们想把这条线加粗一下,需要增加参数:kde_kws=dict(linewidth=5),

代码如下:

代码语言:javascript复制
sns.distplot(cmip6,#数据                 
           color='red',#概率密度线的颜色
           ax=ax,
           label="tas-temp",#蓝色线条的名称,画legend时需要
           kde=True,
           hist=False,
           kde_kws=dict(linewidth=5),
           )

效果:

当前x轴的label是“tas”,其实我们没有命名过这个参数,那么这个x轴的标签是从哪里来的呢?答案就是,它是distplot自动从我们的cmip6这个气象要素中提取值是对应的变量名称,我们这个nc文件中温度值对应的变量名称就叫tas,接下来我们尝试改变一下,需添加参数axlabel = "Temperature:K"。

代码如下:

代码语言:javascript复制
sns.distplot(cmip6,#数据                 
           color='red',#概率密度线的颜色
           ax=ax,
           label="tas-temp",#蓝色线条的名称,画legend时需要
           kde=True,
           hist=False,
            kde_kws=dict(linewidth=5),
           axlabel = "Temperature:K"
           )

效果:

做了以上几处改动,其实效果依然不是很好,本来想尝试把纵坐标的label也改了,但是笔者看完seaborn关于distplot的官方说明,很遗憾未能找到相关参数(可能是本人英文能力有限,未能全部看明白其意义)。而且虽然设置了横坐标的label,但是没有办法调整字体大小,为了统一起见,不再采用axlabel这个参数,还是决定采用ax中set_xlabel和set_ylabel,这两个是比较方便的。

增加以下两行代码:

代码语言:javascript复制
ax.set_ylabel( "Probability density", fontsize=20, labelpad=10 )
ax.set_xlabel( "Temperature:K",fontsize=20 ,labelpad=10)

然后效果就比开始的好一些了:

接下来,再来调整一下x和y轴的刻度,增加代码:

代码语言:javascript复制
ax.minorticks_on()          #打开辅刻度线
ax.tick_params(which='major',width=2)  #主刻度线宽度
ax.tick_params(which='major', length=12)#主刻度线长度
ax.tick_params(which='minor', length=6)#辅刻度线长度

此处设置了主刻度线宽度为2,长度12,以及辅刻度线长度为6。

横坐标和纵坐标的刻度线同时进行了调整,然后调整刻度字体大小:

代码语言:javascript复制
ax.tick_params(labelsize=16)

然后再给这张图增加一个标签:

代码语言:javascript复制
ax.set_title(  "Year Period:2005-2015",loc='center', fontsize=20  )

最终效果就是这样,当然还可以继续美化。

0 人点赞