分布数据可视化 - 直方图与密度图
distplot()
kdeplot()
rugplot()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#设置风格、尺度
sns.set_style("darkgrid")
sns.set_context("paper")
#屏蔽警告
import warnings
warnings.filterwarnings('ignore')
1.直方图 - distplot()
rs = np.random.RandomState(10) # 设定随机数种子
s = pd.Series(rs.randn(100)*100)
sns.distplot(s, bins=10, hist=True, kde=False, norm_hist=False,rug=True, vertical=False, color='y', label='distplot', axlabel='x')
plt.legend()
'''
bins : 箱数
hist、ked:是否显示箱、密度曲线
norm_hist:直方图是否按照密度来显示
rug:是否显示数据分布情况
vertical:是否水平显示
color:设置颜色
label:图例
axlabel:x轴标注
'''
直方图颜色详细设置
sns.distplot(s,rug=True,
rug_kws={'color':'g'}, # 设置数据频率分布颜色
kde_kws={'color':'r', 'lw':1, 'label':'KDE', 'linestyle':'--'},
# 设置密度曲线颜色,线宽,标注,线型
hist_kws={'histtype':'step', 'linewidth':1, 'alpha':1, 'color':'b'})
#设置箱子的风格、线宽、透明度、颜色,风格包括:bar, barstacked, step, stepfilled
2.密度图 - kdeplot()
密度估计的步骤:
- 每一个观测附近用一个正态分布曲线近似
- 叠加所有观测的正态分布曲线
- 归一化
seaborn.kdeplot(data,data2 = None,shade = False,vertical = False,kernel =‘gau’,bw =‘scott’,gridsize = 100,cut = 3,clip = None,legend = True,cumulative = False,shade_lowest = True,cbar = False,cbar_ax =无,cbar_kws =无,ax =无, kwargs)
shade: 如果为True,则用颜色填充KDE曲线下方的区域(或者在数据为双变量时用颜色填充的轮廓)
kernel: {‘gau’|‘cos’|‘biw’|‘epa’|‘tri’|‘triw’} 用于拟合的核,双变量值能用高斯核(gau)
bw: {‘scott’|‘silverman’|标量|一对标量} 确定核的大小,近似理解为拟合程度,bw越大,曲线越平缓。
gridsize:int, 网格中的离散点数
cumulative :是否绘制累积分布
cbar:参数若为True,则会添加一个颜色条(颜色条在双变量kde图像中才有)
# 单个样本数据密度分布图
sns.kdeplot(s,
shade=False, # 是否填充
color='r', # 设置颜色
vertical=False # 设置是否水平
)
sns.kdeplot(s, color='g', bw=5, label='bw: 5', linestyle='-', linewidth=1.2, alpha=0.5)
sns.kdeplot(s, color='b', bw=20, label='bw: 20', linestyle='--', linewidth=1.2, alpha=0.5)
# bw: 控制拟合的程度,类似直方图的箱数,值越大,越平滑
sns.rugplot(s, height=0.1, color='k', alpha=0.5) # 数据频率分布图
sns.kdeplot(s,color='k',cumulative=True,
linestyle = '--',linewidth = 2)
plt.show()
两个样本数据密度分布图
rs = np.random.RandomState(2)
df = pd.DataFrame(rs.randn(100,2), columns=['A','B'])
sns.kdeplot(df['A'],df['B'],
cbar=True, # 是否显示颜色图例
shade=True, # 是否填充
cmap='Reds_r', # 设置颜色盘
shade_lowest=False, # 最外围颜色是否显示
n_levels=10 # 曲线个数(如果非常多,则会越平滑)
)
# 两个维度数据生成曲线密度图,以颜色作为密度衰减显示
sns.rugplot(df['A'], color='g', axis='x', alpha=0.5)
sns.rugplot(df['B'], color='b', axis='y', alpha=0.5)
plt.scatter(df['A'],df['B'],s=5, alpha=0.5, color='k') # 散点图
多个密度图
rs1 = np.random.RandomState(2)
rs2 = np.random.RandomState(5)
df1 = pd.DataFrame(rs.randn(100,2)+2, columns=['A','B'])
df2 = pd.DataFrame(rs.randn(100,2)-2, columns=['A','B'])
sns.kdeplot(df1['A'], df1['B'], cmap='Greens', shade=True, shade_lowest=False)
sns.kdeplot(df2['A'], df2['B'], cmap='Blues', shade=True, shade_lowest=False)