Seaborn学习入门-绘制箱型图、直方图

  • Post author:
  • Post category:其他




关于数据集

在初学Seaborn遇到的第一个问题就是数据集,网上大部分示例都是直接调用内置的数据集,但这其实是联网状态下在线下载数据集,所以遇到网络问题很容易报错。

数据集网址:

https://github.com/mwaskom/seaborn-data


因此更可靠的方式是把数据集下载下来然后在本地加载,而且之后个人使用本来也要加载本地数据集。

参考

知乎文章


load_dataset包含有三个参数:

  1. name:str,代表数据集名字;
  2. data_home:string,代表本地数据的路径可见只要设置好数据路径,然后再把cache设为True即可从本地加载数据了。
  3. cache:boolean,当为True时,从本地加载数据,反之则从网上下载;

如下所示:

# Load Dataset
df = sns.load_dataset('iris',data_home='seaborn-data',cache=True)

# Plot
plt.figure(figsize=(10,8), dpi= 80)
sns.pairplot(df, kind="reg", hue="species")
plt.show()



常用操作

参见文章



风格设置

sns.set() #seaborn默认的组合风格
sns.set_style("darkgrid") 
sns.set_style("whitegrid") #白色底  白色横线
sns.set_style("dark") #深色背景
sns.set_style("white") #白色背景
sns.set_style("ticks") #上下左右轴加刻度线

sns.despine() #去掉上侧和右侧的线



面向对象画图

参考链接

https://codingdict.com/questions/1485


Seaborn中的绘图功能大致分为两类

  • “Axes-level” 功能,包括regplot,boxplot,kdeplot,和许多其他
  • “Figure-level”功能,包括lmplot,factorplot,jointplot和一个或两个其他

通过采用显式ax参数并返回Axes对象来标识第一组。如此建议,你可以将它们传递Axes给它们,从而以“面向对象”的方式使用它们:

f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)



绘制箱型图

参考文章

seaborn学习笔记1-箱形图Boxplot – CSDN



函数原型

seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, 
                orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, 
                linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)

常用参数介绍

  • hue:字符换类型,用于区分类别
  • palette:调色板,可参看

    文章
  • order、hue_order:控制箱体的顺序
  • orient::取值为v、h,v为垂直(vertical)显示,h为水平(horizontal)显示

完整介绍

x,y,hue:数据字段变量名(如上表,date,name,age,sex为数据字段变量名)
作用:根据实际数据,x,y常用来指定x,y轴的分类名称,
hue常用来指定第二次分类的数据类别(用颜色区分)

data: DataFrame,数组或数组列表

order,hue_order:字符串列表
作用:显式指定分类顺序,eg. order=[字段变量名1,字段变量名2,...]

orient:方向:v或者h
作用:设置图的绘制方向(垂直或水平),
如何选择:一般是根据输入变量的数据类型(dtype)推断出来。

color:matplotlib 颜色

palette:调色板名称,list类别或者字典
作用:用于对数据不同分类进行颜色区别

saturation 饱和度:float

dodge:bool
作用:若设置为True则沿着分类轴,将数据分离出来成为不同色调级别的条带,
否则,每个级别的点将相互叠加

size:float
作用:设置标记大小(标记直径,以磅为单位)

edgecolor:matplotlib color,gray
作用:设置每个点的周围线条颜色

linewidth:float
作用:设置构图元素的线宽度

关于调色板自己还没搞得很清楚,尤其是涉及到想设置透明度的问题会比较麻烦,上面在介绍调色板时给出的参考文章设置透明度后和图例的颜色不对应。

这方面介绍的比较完整的文章有



自定义坐标轴

至于如何自定义横纵坐标也很简单,和matplotlib一样就可以了,涉及到图例位置等也都一样。

import seaborn as sns
import matplotlib.pyplot as plt
 
sns.kdeplot(data)  # 核密度估计图
plt.xlabel("xxxxxx")
plt.show()



处理本地数据

需要先把实验数据转换为DataFrame格式,再用Seaborn处理。

import numpy as np
import pandas as pd

N = 500
delta1 = np.random.normal(loc =0.0 , scale= 1.0,size = (N,))
delta2 = np.random.normal(loc =0.4 , scale= 2.0,size = (N,))
delta3 = np.random.normal(loc =0.2 , scale= 1.3,size = (N,))
delta4 = np.random.normal(loc =1.4 , scale= 4.0,size = (N,))

df1 = pd.DataFrame(delta1,columns=['delta'])
df1['alpha_limit']  = 'Yes'
df1['Hierarchical'] = 'Yes'
df2 = pd.DataFrame(delta2,columns=['delta'])
df2['alpha_limit']  = 'Yes'
df2['Hierarchical'] = 'No'
df3 = pd.DataFrame(delta3,columns=['delta'])
df3['alpha_limit']  = 'No'
df3['Hierarchical'] = 'Yes'
df4 = pd.DataFrame(delta4,columns=['delta'])
df4['alpha_limit']  = 'No'
df4['Hierarchical'] = 'No'

df = pd.concat([df1,df2,df3,df4],axis=0)

sns.set()
sns.boxplot( x="alpha_limit", y="delta",data=df,hue="Hierarchical")
plt.xlabel('alpha limit')
plt.ylabel('delta theta')

效果图

在这里插入图片描述



绘制直方图


【参考文章】

绘制直方图所用函数为 distplot,但在Jupyter中会警告说 distplot 将来会被 displot 替代。

如果想要在一张图上叠加多组数据直方图的话直接加就可以了,设置好直方图的透明度即可。

在直方图中主要有以下几个元素

  • rug:频率分布,一般不常用,在底部以短线形式展示
  • kde:密度曲线
  • hist:箱

函数原型

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 ---> 直方图是否按照密度来显示。若为True,则直方图高度显示密度而非计数(含有KDE图形中默认为True)
# rug ---> 是否显示数据分布情况
# vertical ---> 是否水平显示
# color ---> 设置颜色
# label ---> 图例
# axlabel ---> x轴标注



示例


示例1

# 一般格式
# Load the Dataset in Python
tips = sns.load_dataset("tips",data_home='seaborn-data',cache=True)
sns.distplot(tips["total_bill"], bins=int(round(np.sqrt(tips.shape[0]))), 
             hist=True,kde=True,norm_hist=True,
             rug = True, vertical = True,color="purple")
# Binsize is calculated using square-root of row count.
# Binsize is calculated using square-root of row count.

在这里插入图片描述


示例2

import numpy as np
import pandas as pd

N = 500
delta1 = np.random.normal(loc =0.0 , scale= 1.0,size = (N,))
delta2 = np.random.normal(loc =0.4 , scale= 2.0,size = (N,))

df1 = pd.DataFrame(delta1,columns=['delta'])
df1['alpha_limit']  = 'Yes'
df1['Hierarchical'] = 'Yes'
df2 = pd.DataFrame(delta2,columns=['delta'])
df2['alpha_limit']  = 'Yes'
df2['Hierarchical'] = 'No'

sns.distplot(df1['delta'], bins=int(round(np.sqrt(df1.shape[0]))), 
             hist=True,kde=True,norm_hist=True,color="purple",
             label="df1", hist_kws={'alpha':.5}, kde_kws={'linewidth':2})
sns.distplot(df2['delta'], bins=int(round(np.sqrt(df2.shape[0]))), 
             hist=True,kde=True,norm_hist=True,color="green",
             label="df2", hist_kws={'alpha':.3}, kde_kws={'linewidth':2})
plt.legend()
plt.xlabel('x')
plt.ylabel('y')

在这里插入图片描述

在示例2中,为了精细化调整,采用了 hist_kws、kde_kws 这种写法,这种方式的完整形式可参考

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'



设定密度曲线格式

有时密度曲线可以设置成拟合为具体的分布,如

x = np.random.normal(size=100)
sns.distplot(x, kde=False)  # kde 核密度估计
plt.show()
from scipy import stats, integrate
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)  #拟合为正态分布则为stats.norm
plt.show()



求取均值、方差、标准差

如果假定就是正态分布的话,有时可能还需要求均值、方差、标准差,此时用pandas直接求取即可。

m1 = df1['delta'].mean()
v1 = df1['delta'].var()
s1 = df1['delta'].std()

print(f'm1={m1:.3f}, v1={v1:.3f}, s1={s1:.3f}')



版权声明:本文为gsgbgxp原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。