一、分布数据可视化 - 直方图与密度图
displot() / kdeplot()/ rugplot()
加载模块,设置风格,尺度
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns #设置风格,尺度 sns.set_style('darkgrid') sns.set_context('paper') #不发出警告 import warnings warnings.filterwarnings('ignore')
1.直方图 - distplot()
示例1:
rs = np.random.RandomState(10) #设定随机数种子 s = pd.Series(rs.randn(100) * 100) sns.distplot(s, bins = 10, hist = True, kde = True, norm_hist = False, rug = True, vertical = True, color = 'b', label = 'distplot', axlabel = 'x') plt.legend()
#bins ---> 箱数
#hist、ked ---> 是否显示箱/密度曲线
#norm_hist ---> 直方图是否按照密度来显示
#rug ---> 是否显示数据分布情况
#vertical ---> 是否水平显示
#color ---> 设置颜色
#label ---> 图例
#axlabel ---> x轴标注
图1. 直方图
示例2:
sns.distplot(s, rug = True, rug_kws = {'color':'y'}, #设置数据频率分布颜色 kde_kws = {'color':'k', 'lw':1, 'label':'KDE', 'linestyle':'--'}, #设置密度曲线颜色、线宽、标注、 线形 hist_kws = {'histtype':'stepfilled', 'linewidth':1, 'alpha':1, 'color':'g'}) # 设置箱子的风格、线宽、透明度、颜色 # 风格包括:'bar'、'barstacked'、'step'、'stepfilled'
图2. 直方图
2.密度图 - kdeplot()
2.1 单个样本数据密度分布图
sns.kdeplot(s, shade = False, #是否填充 color = 'r', #设置颜色 vertical = False) #设置是否水平) sns.kdeplot(s, bw = 1, label = 'bw : 0.2', linestyle = '--', linewidth = 1.2, alpha = 0.5) sns.kdeplot(s, bw =20, label = 'bw : 2', linestyle = '--', linewidth = 1.2, alpha = 0.5) #bw --> 控制拟合的程度,类似直方图的箱数 #数据频率分布 sns.rugplot(s, height = 0.1, color = 'r', alpha = 0.5)
图3. 单个样本数据密度分布图
2.2 两个样本的数据密度分布图
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', #设置调色盘 shade_lowest = False, #最外围颜色是否显示 n_levels = 50 #曲线个数(如果非常多,则会越平滑) ) #注意设置x,y轴 plt.scatter(df['A'],df['B'],s = 5, alpha = 0.5, color = 'k') sns.rugplot(df['A'], color = 'g', axis = 'x', alpha = 0.5) sns.rugplot(df['B'], color = 'r', axis = 'y', alpha = 0.5)
图4. 两个样本数据的密度分布图
2.3 多个样本的密度图
#多个密度图 #创建数据 rs1 = np.random.RandomState(2) rs2 = np.random.RandomState(5) df1 = pd.DataFrame(rs1.randn(100,2)+2, columns = ['A','B']) df2 = pd.DataFrame(rs2.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)