python数据可视化seaborn(三)——探索变量之间的关系
我们常常想知道变量之间是否存在关联,以及这些关联是否收到其他变量影响。可视化能够帮助我们非常直观的展示这些。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
# 不发出警告
sns.set_context('notebook',font_scale=1.2)
tips = sns.load_dataset("tips")
tips.head()
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
这是一个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)
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 # 设置图像大小和横纵比
)
可以看到,小费与消费总体呈线性正相关,那精确到不同日期,有什么不同么?上图颜色虽有区分但是不够明显,
seaborn可以将分类变量分别绘制到不同的子图中,如下图所示:
sns.relplot(x="total_bill", y="tip", data=tips,
hue="time", # 用颜色对time变量分类
col="day", # 按照day变量分列
col_wrap=2, # 每行2个分类
s=100, # 散点大小(来自plt.scatter的参数)
height=3,aspect=1.5)# 图像大小及每个轴的横纵比
当然,也可以用大小来展示变量的大小强弱等
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)
fmri = sns.load_dataset("fmri")
print(fmri.head())
g = sns.relplot(x="timepoint", y="signal", data=fmri,
hue="event", style="event",
col="region",
markers=True,dashes=False,# 添加标记,禁止虚线
kind="line")
subject timepoint event region signal
0 s13 18 stim parietal -0.017552
1 s5 14 stim parietal -0.080883
2 s12 18 stim parietal -0.081033
3 s11 18 stim parietal -0.046134
4 s10 18 stim parietal -0.037970
lineplot()
在默认情况下会将x按照数值进行排序,也可以禁止。ci=None
来禁止。当然也可以将置信区间替换成标准差ci="sd"
sns.relplot(x="timepoint", y="signal",
data=fmri,sort=False, # 禁止对x排序
kind="line",ci=False) # 禁止有置信区间
要完全关闭聚合,可以这么设置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中的线性关系可视化