python数据可视化seaborn(三)——探索变量之间的关系
我们常常想知道变量之间是否存在关联,以及这些关联是否收到其他变量影响。可视化能够帮助我们非常直观的展示这些。
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inlineimport warningswarnings.filterwarnings('ignore') # 不发出警告sns.set_context('notebook',font_scale=1.2)tips = sns.load_dataset("tips")tips.head() total_billtipsexsmokerdaytimesize016.991.01FemaleNoSunDinner2110.341.66MaleNoSunDinner3221.013.50MaleNoSunDinner3323.683.31MaleNoSunDinner2424.593.61FemaleNoSunDinner4 relplot这是一个seaborn新的图形级函数,通过kind参数,能对scatterplot()和lineplot()两个轴级函数进行访问。
*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)
[hue,size,style]: 可以生成不同的颜色,大小,样式来独立的显示第三个变量[row,col]: 按照某个变量分列或者分行col_wrap: int, 分成几列(不能与参数row共同出现)sizes: 对size参数的每个分类设定大小 大小值列表变量到大小的字典映射包含最大最小的元组,会在此范围对值归一化 [col,row,size,hue,style]_order: 指定变量出现的顺序。hue_norm: 当hue的变量值数字时,用于将colormap标准化,如果是分类变量则无关。size_norm: 数据单元的标准化,当size变量为数字时缩放图像legend: 如何绘制图例 False:不绘制图例‘brief’(默认):数值型的hue和size参数会用均匀间隔的样本表示‘full’:对比‘brief’,每个组都会在图例中输出一个条目 facet_kws: 要传递给FacetGrid其他参数的字典 散点图 sns.relplot(x="total_bill", y="tip", data=tips, kind='scatter', # ['scatter','line'] hue='day', # 设置按颜色分类的第三变量# style='day', # 设置形状分类 palette='husl',s=60, # 设置调色盘类型和散点大小 aspect=1.5,height=6 # 设置图像大小和横纵比 )![png](output_5_1.png
可以看到,小费与消费总体呈线性正相关,那精确到不同日期,有什么不同么?上图颜色虽有区分但是不够明显,
seaborn可以将分类变量分别绘制到不同的子图中,如下图所示:
当然,也可以用大小来展示变量的大小强弱等
sns.relplot(x="total_bill", y="tip", data=tips, hue="time", size="size", palette=["b", "r"], sizes=(30, 120),# size大小按照最小20最大120分布 col="time")# 按照time分列当然也可以将点设置成不同的形状来区分类别,但是不建议单独将一个变量与形状表示,因为形状的区分不是很明显,建议和颜色一同使用。
sns.relplot(x='total_bill',y='tip',data=tips, hue='smoker',style='smoker',s=50)颜色既可以展示离散变量,也可以展示连续变量,还可以对调色盘自定义
sns.relplot(x='total_bill',y='tip',data=tips, hue='size',palette='ch:r=-.5,l=.75') 线图用relpot绘制线图其实是对lineplot()函数的访问,所以lineplot的所有参数都可以用在这里面。同样的,scatterplot()函数的参数设置与此几乎相同。
*seaborn.lineplot(x=None, y=None, hue=None, size=None, style=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, dashes=True, markers=None, style_order=None, units=None, estimator=‘mean’, ci=95, n_boot=1000, sort=True, err_style=‘band’, err_kws=None, legend=‘brief’, ax=None, *kwargs)
要完全关闭聚合,可以这么设置estimator=None,不过当数据在每个点有多个观察值时,可能会产生奇怪的效果
sns.relplot(x="timepoint", y="signal", estimator=None, kind="line", data=fmri)有时候我们需要对同一个问题做重复测量并比较。那么seaborn也可以单独绘制
sns.relplot(x="timepoint", y="signal", hue="region", units="subject", estimator=None, kind="line", data=fmri.query("event == 'stim'"))线图通常用于可视化与实际日期和时间相关的数据。这些函数将原始格式的数据传递给底层matplotlib函数,因此它们可以利用matplotlib在刻度标签中格式化日期的能力。但是所有的格式化都必须在matplotlib层进行,您可以参考matplotlib文档来了解它是如何工作的:
fig = plt.figure(figsize=(8,6))df = pd.DataFrame(dict(time=pd.date_range("2017-1-1", periods=500), value=np.random.randn(500).cumsum()))g = sns.relplot(x="time", y="value", kind="line", data=df)g.fig.autofmt_xdate() # 当X轴是时间格式时,用此方法旋转避免重叠。如果要检查变量多个分类的效果,最好将它放在列上分类。
sns.relplot(x="timepoint", y="signal", hue="event", style="event", col="subject", col_wrap=5, height=3, aspect=.75, linewidth=2.5, kind="line", data=fmri.query("region == 'frontal'"))下篇文章,我们讨论seaborn中的线性关系可视化