Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。同时它能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
Table of Contents
2.2 Categorical distribution plots
2.3 Categorical estimate plots
1.Relational plots(关系图)
1.1 Scatter Plot(散点图)
sns.scatterplot(x=None, y=None, hue=None, style=None, size=None, data=None, palette=None,
hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None,
markers=True, style_order=None, x_bins=None, y_bins=None, units=None, estimator=None,
ci=95, n_boot=1000, alpha='auto', x_jitter=None, y_jitter=None, legend='brief', ax=None, **kwargs)
x,y:数据/数据向量/dataframe中的列;
hue:分组变量,可产生不同颜色的点;
size:分组变量,可产生不同大小的点;
style:分组变量,可产生不同标记的点;
data:dataframe;
palette:调色板,用于hue;
markers:绘图的形状;
ci:允许的误差范围(空值误差的百分比,0-100之间),可为‘sd’,则采用标准差(默认95);
n_boot(int):计算置信区间要使用的迭代次数;
alpha:透明度;
x_jitter,y_jitter:设置点的抖动程度
tips=pd.read_excel(r'C:\Users\小Q11\OneDrive\Documents\数据集\tips.xlsx')#sns.load_dataset('tips')
plt.figure(figsize=(8,6))
cmap = sns.cubehelix_palette(dark=.3, light=.8, as_cmap=True)
ax = sns.scatterplot(x="total_bill", y="tip",hue="day",style="time",size='size',palette='Set2',data=tips)
# seaborn是基于matplotlib,所以matplotlib的习惯不用发生改变
plt.legend(loc='best')
plt.show()
1.2 Line Plot(线图)
#使用标记以及破折号来识别组
plt.figure(figsize=(8,6))
ax = sns.lineplot(x="total_bill", y="tip",hue="sex", style="smoker",markers=True, dashes=True, palette='RdBu_r', data=tips)
plt.show()
1.3 Relplot(关系图)
seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, data=None, row=None, col=None,
col_wrap=None, row_order=None, col_order=None, palette=None, hue_order=None, hue_norm=None,
sizes=None, size_order=None, size_norm=None, markers=None, dashes=None,style_order=None,
legend='brief', kind='scatter', height=5, aspect=1,facet_kws=None, **kwargs)
sizes:List、dict或tuple,可选,简单点就是图片大小,注意和size区分;
col、row:决定网格的面数的分类变量,很像tableau
ax=sns.relplot(x="total_bill",y="tip",hue='time',size='size',palette=['b','r'],col='time',row='sex',sizes=(20,200),data=tips)
2.Categorical Plots(分类图)
2.1 Categorical scatterplots
2.1.1 Stripplot(分布散点图)
sns.stripplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, jitter=True, dodge=False,
orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)
x,y,data:输入数据可以多种格式传递,在大多数情况下,使用Numpy或Python对象是可能的,但是更可取的是pandas对象,因为相关的名称将用于对轴进行注释。此外,还可以对分组变量使用分类类型来控制情节元素的顺序。
order:字符串列表,用order参数进行筛选分类类别,例如:order=[‘Dinner’,‘Lunch’];
jitter:抖动项,表示抖动程度,可以使float,或者True;
dodge:重叠区域是否分开,当使用hue时,将其设置为True,将沿着分类轴将不同色调级别的条带分开。
orient:“v” | “h”,vertical(垂直) 和 horizontal(水平)的意思;
ax=sns.stripplot(x="day",y="total_bill",hue="time",order=['Sun','Thur','Fri'],data=tips,jitter=0.3,dodge=True,orient="v")
2.1.2 Swarmplot(分布密度散点图)
类似stripplot,只是对点位置沿着x轴方向进行了调整,使之更好展示值的分布,但不能扩展到大量的观察
sns.swarmplot(x="day",y="total_bill",hue="smoker",data=tips,dodge=True)
2.2 Categorical distribution plots
2.2.1 Boxplot(箱线图)
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, ax=None, **kwargs)
color:所有元素的顏色,或漸變調色板的種子;
palette:用於``hue''變量不同級別的顏色;
saturation:饱和度,可设置为1;
width:float,控制箱型图的宽度大小;
fliersize:float,用于指示离群值观察的标记大小;
whis:IQR超出低四分位數和高四分位數的比例,以擴展情節須。超出此範圍的點將被識別為離群值。
ax=sns.boxplot(x="day",y="total_bill",hue="time",data=tips,saturation=1.2,width=0.8,fliersize=5,palette="Set2")
2.2.2 Violinplot(小提琴图)
小提琴圖與盒須圖類似。 它顯示了一個或多個分類變量在多個級別上的定量數據分佈,從而可以比較這些分佈。
不同於箱形圖,在箱形圖中所有圖分量都對應於實際數據點,小提琴圖的特徵在於對基礎分佈的核密度估計。
這可能是一次顯示多種數據分佈的有效且有吸引力的方法,但是估計過程受樣本量的影響,相對較小樣本的小提琴可能會誤導人。
violinplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, bw='scott', cut=2, scale='area',
scale_hue=True, gridsize=100, width=0.8, inner='box', split=False, dodge=True, orient=None, linewidth=None,
color=None, palette=None, saturation=0.75, ax=None, **kwargs)
bw:‘scott’, ‘silverman’, float,控制拟合程度。在计算内核带宽时,可以引用规则的名称(‘scott’, ‘silverman’)或者使用比例(float)。实际内核大小将通过将比例乘以每个bin内数据的标准差来确定;
cut:空值外壳的延伸超过极值点的密度,float;
scale:“area”, “count”, “width”,用来缩放每把小提琴的宽度的方法;用於縮放每個小提琴寬度的方法。 如果是``area'',則每個小提琴將具有相同的 面積。 如果``計數'',則小提琴的寬度將根據該倉中的觀察數量進行縮放。 如果為``width'',則每個小提琴將具有相同的寬度。
scale_hue:当使用hue分类后,设置为True时,此参数确定是否在主分组变量进行缩放;
gridsize:设置小提琴图的平滑度,越高越平滑;
inner:“box”, “quartile”, “point”, “stick”, None,小提琴内部数据点的表示。分别表示:箱子,四分位,点,数据线和不表示;
split:是否拆分,当设置为True时,绘制经hue分类的每个级别画出一半的小提琴;
ax = sns.violinplot(x=tips["total_bill"])
ax = sns.violinplot(x="day", y="total_bill", hue="sex",data=tips, palette=sns.hls_palette(8, l = .8, s = .5),
split=True,scale="count", inner="quartile")
ax=sns.violinplot(x='tip',y='day',data=tips,palette='Set3',scale='count',inner=None,whis=np.inf)#np.inf只无穷大
ax=sns.stripplot(x='tip',y='day',data=tips,jitter=True,color='c',size=3)
2.3 Categorical estimate plots
2.3.1 Pointplot(点图)
點圖通過散點圖的位置表示對數值變量的集中趨勢的估計,並使用誤差線提供了一些圍繞該估計的不確定性的指示,也就是点估计和置信区间。
在集中比較一個或多個分類變量的不同級別時,點圖比條形圖更有用。他們特別擅長顯示交互作用:一個分類變量的級別之間的關係如何在第二個分類變量的級別之間變化。從相同的``色相''層次連接每個點的直線允許通過斜率差異來判斷交互作用,這對眼睛而言比比較幾組點或條的高度更容易。
重要的是要記住,點圖僅顯示均值(或其他估計量),但是在許多情況下,顯示分類變量的每個級別上的值分佈可能更有益。在這種情況下,其他方法(例如方盒或小提琴圖)可能更合適。
pointplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, estimator=<function mean at 0x000001AB20B689D8>,
ci=95, n_boot=1000, units=None, seed=None, markers='o', linestyles='-', dodge=False, join=True, scale=1,
orient=None, color=None, palette=None, errwidth=None, capsize=None, ax=None, **kwargs)
order:选择和空值顺序,例如:order=[‘Sat’,‘Sun’]。
join:默认两个均值点会相连接,若不想显示,可以通过join=False参数实现。
scale:float,均值点(默认)和连线的大小和粗细。
estimator:可調用的向量->標量映射,可選統計函數,用於在每個分類箱中進行估計。默认均值。
ci:允许的误差的范围(控制误差棒的百分比,在0-100之间),若填写"sd",则用标准误差(默认为95),也可设置ci=None。
n_boot:計算置信區間時要使用的引導程序迭代次數。
seed:可選的Seed或隨機數生成器,用於可重現的引導程序。
errwidth:誤差線(和頂蓋)的粗細。
capsize:誤差條上“上限”的寬度。
ax:将绘图绘制到的轴对象,否则使用当前轴。
ax=sns.pointplot(x='time',y='total_bill',data=tips)
ax=sns.pointplot(x='time',y='total_bill',hue='smoker',data=tips,dodge=True,estimator=np.median,markers=['o','x'],linestyles=['-','--'],color="#bb3f3f")
ax=sns.pointplot(x='time',y='total_bill',hue='smoker',data=tips,dodge=True,markers=['o','x'],linestyles=['-','--'],
palette="Set2",capsize=0.02)
2.3.2 Barplot(条形图)
ax = sns.barplot(x="day", y="total_bill",hue='sex', order=['Sun','Sat','Thur','Fri'],data=tips, estimator=np.median,ci=95,
n_boot=1000,units=None,orient=None,color=None,palette='Set3',saturation=0.75,errcolor='c',errwidth=1,
capsize=0.2,dodge=True,ax=None)
plt.legend(loc='best')
plt.title("seaborn.barplot")
plt.show()
2.3.3 Countplot(计数统计图)
ax=sns.countplot(x="day", hue="smoker", data=tips, palette='Set2')
ax=sns.countplot(y="day", hue="smoker", data=tips, facecolor=(0,0,0,0),linewidth=5,edgecolor=sns.color_palette("dark",4))
2.3.4 Catplot
sns.catplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=<function mean 0x0000026369D089D8>, ci=95, n_boot=1000, units=None, seed=None, order=None, hue_order=None, row_order=None, col_order=None, kind='strip', height=5, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)
col_wrap:int,以该宽度“包装”列变量,以使列构面跨越多行。与``行''构面不兼容。
order,hue_order:字符串列表,optiona,用于在其中绘制分类级别的顺序,否则从数据对象推断级别。
row_order,col_order:字符串列表,可选,用于组织网格中的行和/或列的顺序,否则从数据对象中推断顺序。
kind:"point", "bar", "strip", "swarm","box", "violin", or "boxen"。
height:每个构面的高度(以英寸为单位)。
Aspect:每个刻面的长宽比,以便``aspect * height''给出每个刻面的宽度,以英寸为单位。
legend:在剧情上绘制图例。
legend_out:将扩展图形大小,并且将图例在右上角的情节之外绘制。
share {x,y}:如果为true,则构面将共享跨列的y轴和/或x轴跨行。
ax=sns.catplot(x='sex',y='total_bill',hue='smoker',col='time',height=5,aspect=1,data=tips,kind="violin")
ax=sns.catplot(x='time',col_wrap=2,col='day',height=3,aspect=1,data=tips,kind="count")
3.Distribution Plot(分布图)
3.1 Distplot(直方图)
distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None,
color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
a:系列,一维数组或列表。观察到的数据。如果这是具有``name''属性的Series对象,则该名称将用于标记数据轴。
hist:bool,是否绘制(规范的)直方图。
bins:箱子数量
kde:bool,是否绘制高斯核密度估计。
rug:bool。是否在支撑轴上绘制地毯图。控制是否生成观测数值的小细条(边际毛毯)
fit:控制拟合的参数分布图形,能够直观地评估它与观察数据的对应关系(黑色线条为确定的分布)
hist_kws:dict,可选。关键字参数:meth:`matplotlib.axes.Axes.hist`。
kde_kws:dict,可选。kdeplot的关键字参数。
rug_kws:dict,可选。rugflot的关键字参数。
color:matplotlib颜色,可选。颜色用于绘制除拟合曲线以外的所有内容。
vertical:bool,可选。如果为True,则观察值在y轴上。
norm_list:如果为True,则直方图高度显示的是密度而不是计数。如果绘制了KDE或拟合的密度,则表示这是隐含的。
axlabel:字符串,False或None(可选)。支撑轴标签的名称。如果为None,则尝试从a.name获取它;如果为False,请不要设置标签。
label:字符串,可选。图的相关组件的传奇标签。
ax:matplotlib轴,可选。如果提供,请在该轴上绘图。
np.random.seed(0)
x=np.random.randn(100)
ax=sns.distplot(x,hist=False,rug=True)
from scipy.stats import norm
ax = sns.distplot(x, fit=norm, kde=False)
ax=sns.distplot(x,vertical=True,fit=norm,color='m')
ax=sns.distplot(x,rug=True,rug_kws={"color":"g"},
kde_kws={"color":"k","lw":3,"label":"KDE"},
hist_kws={"histtype":"step","lw":3,"alpha":0.5,"color":"g"})
3.2 Kdeplot(核密度图)
核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。
通过核密度估计图可以比较直观的看出数据样本本身的分布特征
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=None, cbar_kws=None, ax=None, **kwargs)
data、data2:表示可以输入双变量,绘制双变量核密度图;
shade:是否填充阴影,默认不填充;
vertical:放置的方向,如果为真,则观测值位于y轴上(默认False,x轴上);
kernel:{‘gau’ | ‘cos’ | ‘biw’ | ‘epa’ | ‘tri’ | ‘triw’ }。默认高斯核(‘gau’)二元KDE只能使用高斯核。至于什么是核函数,这个学问就大了,建议多看看论文;
bw:{‘scott’ | ‘silverman’ | scalar | pair of scalars }。四类核密度带方法,默认scott (斯考特带宽法),建议下来了解一下这四种方法的区别;
gridsize:这个参数指的是每个格网里面,应该包含多少个点,越大,表示格网里面的点越多。越小表示格网里面的点越少;
cut:参数表示,绘制的时候,切除带宽往数轴极限数值的多少,这个参数可以配合bw参数使用;
cumulative:是否绘制累积分布;
shade_lowest:是否有最低值渲染,这个参数只有在二维密度图上才有效;
clip:表示查看部分结果,是一个区间;
cbar:参数若为True,则会添加一个颜色棒(颜色帮在二元kde图像中才有)。
mean,cov=[0,2],[(1,0.5),(0.5,1)]
x,y=np.random.multivariate_normal(mean,cov,size=50).T
ax=sns.kdeplot(x,shade=True,color='r')#单变量核密度图
ax=sns.kdeplot(x,y,shade=True,shade_lowest=False,cbar='True',cmap='Blues')#双变量核密度图
3.3 Jointplot(联合分布图)
联合概率分布简称联合分布,是两个及以上随机变量组成的随机向量的概率分布。
根据随机变量的不同,联合概率分布的表示形式也不同。
对于离散型随机变量,联合概率分布可以以列表的形式表示,也可以以函数的形式表示;对于连续型随机变量,联合概率分布通过一非负函数的积分表示。
sns.jointplot(x, y, data=None, kind='scatter', stat_func=None, color=None, height=6, ratio=5, space=0.2, dropna=True, xlim=None,
ylim=None, joint_kws=None, marginal_kws=None, annot_kws=None, **kwargs)
x,y:为DataFrame中的列名或者是两组数据,data指向dataframe;
kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }。默认散点图;
stat_func:用于计算统计量关系的函数;
ratio:中心图与侧边图的比例,越大、中心图占比越大;
dropna:去除缺失值;
height:图的尺度大小(正方形);
space:中心图与侧边图的间隔大小;
xlim,ylim:x,y的范围
ax=sns.jointplot(x="total_bill",y='tip',data=tips)
ax=sns.jointplot(x="total_bill",y="tip",kind='kde',data=tips,color='r')
iris=pd.read_excel(r'C:\Users\小Q11\OneDrive\Documents\数据集\iris.xlsx')
ax=(sns.jointplot("sepal_length", "sepal_width",data=iris,color="k").plot_joint(sns.kdeplot,zorder=0,n_levels=6))
x,y=np.random.randn(2,300)
axis=sns.jointplot(x,y,kind='hex').set_axis_labels("x","y")
ax=sns.jointplot("petal_length","sepal_length",data=iris,marginal_kws=dict(bins=15,rug=True),annot_kws=dict(stat="r"),
s=50,edgecolor="w",linewidth=2)
3.4 Pairplot(变量关系组图)
sns.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind='scatter', diag_kind='auto',
markers=None, height=2.5, aspect=1, corner=False, dropna=True, plot_kws=None, diag_kws=None, grid_kws=None, size=None)
vars:变量名列表,要在data中使用的变量,否则将每列都使用数字数据类型。
{x,y} _vars:变量名列表,“数据”中的变量,分别用于图中的行和列; 即制作一个非正方形的图
kind:{‘scatter’, ‘reg’};
diag_kind:{‘auto’, ‘hist’, ‘kde’}。单变量图(自己与自己比较)的绘图,对角线子图的图样。默认情况取决于是否使用“hue”
{plot,diag,grid} _kws:dicts。关键字参数的字典。 将plot_kws传递给双变量绘图函数,将diag_kws传递给单变量绘图函数,将grid_kws传递给PairGrid构造函数。
axis=sns.pairplot(iris)
axis=sns.pairplot(iris,hue="species",vars=["sepal_width","sepal_length"],palette="husl",markers=["o","s","D"])
ax=sns.pairplot(iris,x_vars=["sepal_width","sepal_length"],y_vars=["petal_width","petal_length"])
4.Regression Plot(回归图)
4.1 Lmplot
sns.lmplot(x, y, data, hue=None, col=None, row=None, palette=None, col_wrap=None, height=5, aspect=1, markers='o',
sharex=True, sharey=True, hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True,
x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None,
seed=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None,
truncate=True, x_jitter=None, y_jitter=None, scatter_kws=None, line_kws=None, size=None)
x_estimator:可调用的映射向量->标量。将此函数应用于``x''的每个唯一值并绘制得出的估计值。如果给出``x_ci``,该估计将被引导并得出置信区间。
x_bins:整数或向量。将``x''变量绑定到离散的bin中,然后估计中心趋势和置信区间。 这种装箱仅影响散点图的绘制方式; 回归仍然适合原始数据。
此参数被解释为均匀大小(不必要间隔)的垃圾箱数或垃圾箱中心的位置。 使用此参数时,意味着x_estimator的默认值为numpy.mean。
order:多项式回归,控制进行回归的幂次。设定指数,可以用多项式拟合。
logistic:逻辑回归;
robust:如果是True,使用statsmodels来估计一个稳健的回归(鲁棒线性模型)。这将减少异常值。请注意 logistic回归和robust回归相较于简单线性回归需要更大的计算量,其置信区间的产生也依赖于bootstrap采样,你可以关掉置信区间估计来提高速度(ci=None);
lowess:如果是True,使用statsmodels来估计一个非参数的模型(局部加权线性回归)。这种方法具有最少的假设,尽管它是计算密集型的,但目前无法为这类模型绘制置信区间;
logx:转化为log(x)
truncate:bool,可选。默认情况下,在绘制散点图之后,绘制回归线以填充x轴限制。 如果truncate为True,它将受到数据限制的限制。
axis=sns.lmplot(x="total_bill",y="tip",hue="smoker",data=tips,markers=["o","x"],palette="Set1")#palette=dict(Yes="g", No="m")
axis=sns.lmplot(x="total_bill",y="tip",col="smoker",data=tips,x_jitter=0.1)
g=((sns.lmplot(x="total_bill",y="tip",row="sex",col="time",data=tips,height=5, aspect=1))
.set_axis_labels("Total bill (US Dollars)", "Tip")
.set(xlim=(0,60),ylim=(0,12),xticks=[10,30,50],yticks=[2,6,12])
.fig.subplots_adjust(wspace=0.02))
sns.regplot(x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000,
units=None, seed=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None,
y_partial=None, truncate=True, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, marker='o',
scatter_kws=None, line_kws=None, ax=None)
axis=sns.regplot(x="total_bill",y="tip",data=tips,marker="x")
5. Matrix Plots(矩阵图)
5.1 Heatmap
heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)
normal_data=np.random.randn(10,12)
ax=sns.heatmap(normal_data,center=0,annot=True,fmt=".2f",cmap="YlGnBu",linewidths=.5)#annot_kws={'size':9,'weight':'bold', 'color':'w'}
5.2 Clustermap
......
6.FacetGrid
......
7.PairGrid
......
这几个图就不说了,感觉重复性挺高的,上面那些图就可以实现了