关于数据集
在初学Seaborn遇到的第一个问题就是数据集,网上大部分示例都是直接调用内置的数据集,但这其实是联网状态下在线下载数据集,所以遇到网络问题很容易报错。 数据集网址:https://github.com/mwaskom/seaborn-data 因此更可靠的方式是把数据集下载下来然后在本地加载,而且之后个人使用本来也要加载本地数据集。 参考知乎文章 load_dataset包含有三个参数:
- name:str,代表数据集名字;
- data_home:string,代表本地数据的路径可见只要设置好数据路径,然后再把cache设为True即可从本地加载数据了。
- cache:boolean,当为True时,从本地加载数据,反之则从网上下载;
如下所示:
df = sns.load_dataset('iris',data_home='seaborn-data',cache=True)
plt.figure(figsize=(10,8), dpi= 80)
sns.pairplot(df, kind="reg", hue="species")
plt.show()
常用操作
参见文章 Seaborn.set()与Seaborn.catplot() - CSDN 可视化“大佬”之Seaborn
绘制箱型图
参考文章 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()
示例
示例1
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")
示例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'})
设定密度曲线格式
有时密度曲线可以设置成拟合为具体的分布,如
x = np.random.normal(size=100)
sns.distplot(x, kde=False)
plt.show()
from scipy import stats, integrate
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)
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}')
|