相关文章推荐
爱运动的木瓜  ·  Three.JS不能更改HDR ...·  4 月前    · 
刚分手的皮蛋  ·  Windows 停止错误 - ...·  1 年前    · 
善良的稀饭  ·  React Umi SSR SSG ...·  1 年前    · 
【python】【matplotlib&seaborn】概率密度图

【python】【matplotlib&seaborn】概率密度图

最近正在抓头画图(其实就是调),特此记录顺便分享一下。

首先明确,需要的是 概率密度图 ,找到个 seaborn.distplot()的Demo ,上代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
# 这个seed(),就是确定一组随机数,
## 如果后面还需要用到这组随机数,
## 可以保持参数一致重新执行一次,后面出来的随机数数组是一致的。
# rn1 是生成的一组mean为 0 ,SD为 1 的正态分布的数组
np.random.seed(520)
rn1 = np.random.normal(loc=0, scale=1, size=1000)
# 使用ggplot的样式
plt.style.use('ggplot')
# 本次需求的核心代码,seaborn.distplot()用于绘制直方图、概率密度/核密度曲线、拟合曲线。
## 其中 rn1 是输入数据,是一个list或一个np的narray对象;
## hist=True/False,是否绘制直方图,可以添加hist_kws={},进行详细设置,不在需求内,不赘述;
## kde=True/False,是否绘制核密度曲线,可以添加kde_kws={},进行详细设置,实际使用时,概率密度曲线常使用拟合曲线表示,不赘述;
## fit=stats.norm,拟合模型,一般是正态分布,norm/stats.norm都可以,可以添加fit_kws={}进行消息设置,
### fit_kws={'color':'拟合曲线颜色','label':'图例说明','linestyle':'曲线样式'}
sns.distplot(rn1, hist=False, kde=False, fit=stats.norm, fit_kws={'color':'black', 'label':'u=0,s=1','linestyle':'-'})
# legend()显示图例,savefig()保存图片,show()绘图
plt.legend()
plt.savefig('Demo.png')
plt.show()

典型的注释比代码多系列(没办法,年纪大了记性不好。),哈哈哈,接下来是上图。

坐标轴的刻度是依据数据范围自动生成

Demo是有了,但nothing,不是我需要的,因此就在这个基础上调呗。

1、不想要图例,2、不想要灰色网格背景,3、X和Y轴加上名称,4、坐标轴加上方向箭头,5、top和right的轴不显示,6、X轴坐标刻度只显示自己想要的值,7、6中的值替换成想要的文本,8、Y轴的值不显示

根据Demo,重头写,继续上代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
import mpl_toolkits.axisartist as axisartist
# python里的很多包会自作聪明的帮你加载各种样式,因此先整个新的画布
fig = plt.figure()
# 不想要Demo中的这个样式,实验结果是去掉了灰色网格背景,Mission2 Get!
#plt.style.use('ggplot')
# 创建一个绘图区对象,用于调整坐标轴
ax = axisartist.Subplot(fig,111)
# 添加绘图区对象到画布中,这里没报错很神奇,不理解,无限套娃?
fig.add_axes(ax)
# 坐标轴加上方向箭头,Mission4 Get!
ax.axis["bottom"].set_axisline_style("->", size = 1.5)
ax.axis["left"].set_axisline_style("->", size = 1.5)
# 本次需求的核心代码,核密度曲线和拟合曲线都画出来看看有什么区别。
## X轴名称也在这加,然而Y轴不是,Mission3 Half Get!
plot = sns.distplot(data,hist=False,kde=True,kde_kws={'color':'red',linestyle':'-'},fit=stats.norm,fit_kws={'color':'black','label':le,'linestyle':'-',},axlabel='chr13_ratio')
## Y轴添加名称,Mission3 Get!
plt.ylabel('Density')
# top和right的轴不显示,Mission5 Get!
ax.axis["top"].set_visible(False)
ax.axis["right"].set_visible(False)
# X轴上,我只想显示以下值,值是啥我就没写进来,反正是值。
xL = list(map(float,[sigma_30,sigma_20,sigma_10,dataM1,sigma_11,sigma_21,sigma_31]))
# X轴上只显示xL的值,并且用list里的文本替换,Mission6 & 7 Get!
plt.xticks(xL,['-3σ','-2σ','σ','mean','σ','2σ','3σ'])
# Y轴的值不显示,Mission8 Get!