seaborn官方文档翻译
统计分析是理解数据集中各个变量彼此关系的重要过程,通过统计分析,我们就可以洞见数据中隐藏的趋势和规律,更好的揭示数据之间的关系。
在本教程中我们主要讨论三种seaborn函数:
relplot(kind) 画图函数kind参数可以为"scatter"或者"line"
scatterplot() 散点图函数
lineplot() 折线图函数
不论数据结构多么复杂,seaborn的这些函数可以很简明的将数据展示出来。比如在二维空间中,seaborn可以在图中通过色调(hue)、尺寸(size)、风格(style)等方式来展示三维数据结构。具体怎么使用请看继续往下学习
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#让jupyter notebook的Cell可以将多个变量显示出来。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'
sns.set(style="darkgrid")
使用散点图展现相关变量
散点图是统计可视化方法中的中流砥柱。可以使用relplot(kind='scatter')或者scatter()作图
tips = pd.read_csv('tips.csv')
#tips数据集中包含total_bill、tip、sex、smoker、day、time、size这些字段
tips.head()
sns.relplot(x="total_bill",
y="tip",
data=tips)
#sns.scatterplot(x="total_bill", y="tip", data=tips) #效果等同于relplot函数
style样式
当有第三个变量参与绘图,在seaborn中可以使用style(类别样式参数),因为类别本身也是带有信息的。
sns.relplot(x="total_bill",
y="tip",
style="smoker",
data=tips)
hue色标
但是上图看着smoker类目,No和yes很难在图中区分。如果能有色调的区别,更容易肉眼区分开来。这里使用色调参数 hue
sns.relplot(x="total_bill",
y="tip",
hue="smoker",
style="smoker",
data=tips)
当然我们也可以在图中对四种变量进行统计性分析。四个变量分别是total_bill、tip、smoker、time
sns.relplot(x="total_bill",
y="tip",
hue="smoker",
style="time",
data=tips)
palette调色板
在两个例子中,我们可以自定义调色板(color palette),这样做有很多options。在这里,我们使用字字符串接口自定义 顺序调色板。
sns.relplot(x="total_bill",
y="tip",
hue="size",
#ch变化范围(2.5,-0.2),从浅色(大于0)到深色(小于0)
#色调的明暗程度dark取值范围(0,1),dark值越大散点的颜色越浅
palette="ch:2.5,-0.2,dark=0.1",
data=tips)
size尺寸
对于三个变量的可视化,其实还可以使用尺寸size参数来可视化。
sns.relplot(x='total_bill',
y='tip',
size='size',
data=tips)
size还可以设置范围
sns.relplot(x='total_bill',
y='tip',
size='size',
sizes=(15, 200),
data=tips)
散点图使用很方便,但这并不是万能通用的可视化方法。例如,我们想探索某些数据集中的某个变量随着时间的变化趋势,或者该变量是连续型变量,此时使用lineplot()更好。或者relplot(kind='line')。
我们伪造一份随着时间变化的数据
data = dict(time=np.arange(500),
value=np.random.randn(500).cumsum())
df = pd.DataFrame(data)
g = sns.relplot(x="time",
y="value",
kind="line",
data=df)
g.fig.autofmt_xdate()
sort参数
因为lineplot()假定我们绘制的图因变量是y,自变量是x。绘图前默认从x轴方向对数据进行排序。但是,这种情况是可以被禁用的:
df = pd.DataFrame(np.random.randn(500, 2).cumsum(axis=0),
columns=["x", "y"])
sns.relplot(x="x",
y="y",
sort=True,
kind="line",
data=df)
sns.relplot(x="x",
y="y",
sort=False,
kind="line",
data=df)
03-聚合并表示不确定性
更复杂的数据集将对x变量的相同值有多个观测值。seaborn中默认通过绘制x的平均值和x的95%置信区间来聚合每个x的多个测量值:
fmri = pd.read_csv('fmri.csv')
fmri.head()
sns.relplot(x='timepoint',
y='signal',
kind='line',
data=fmri)
置信区间ci
使用bootstrapping来计算置信区间(confidence intervals),这对于较大的数据集来说会是时间密集型的。因此我们可以对该方法采用禁用。参数ci=None表示禁用
sns.relplot(x='timepoint',
y='signal',
kind='line',
ci=None,
data=fmri)
另一个好的选择,特别是对于更大的数据,是通过绘制标准偏差sd而不是置信区间来表示每个时间点的分布范围。ci参数设置为'sd'
sns.relplot(x='timepoint',
y='signal',
kind='line',
ci='sd',
data=fmri)
estimator
要完全剔除聚合效应,请将estimator参数设置为None。当数据在每个点上有多个观察值时,这可能会产生奇怪的效果。
sns.relplot(x='timepoint',
y='signal',
kind='line',
estimator=None,
data=fmri)
使用语义映射绘制数据子集
Plotting subsets of data with semantic mappings
lineplot()拥有与relplot()、scatterplot()类似的灵活性:同样可以借助色调hue、尺寸size和样式style将三种变量展示在二维图表中。因此我们不用停下来思考如何使用matplotlib对点线具体的参数进行设置。
使用lineplot()也会诊断数据如何借助语义进行聚合。例如在制图时,加入色调hue会将图表分为两条曲线以及错误带(error band),每种颜色对应的指示出数据的子集:
色调hue
下面我们看看hue具体例子
fmri = pd.read_csv('fmri.csv')
fmri.sample(5)
sns.relplot(x='timepoint',
y = 'signal',
hue='event',
kind='line',
data=fmri)
样式style
改变制图中的样式
sns.relplot(x='timepoint',
y = 'signal',
hue='event',
style='event',
kind='line',
data=fmri)
注意上面代码中hue和style参数都是一个变量,所以绘制的图与之前生成的图变动不大。只是cue类曲线从实线变成虚线。
现在hue和style参数不同后,我们在运行试试
sns.relplot(x='timepoint',
y = 'signal',
hue='region',
style='event',
kind='line',
data=fmri)
与散点图一样,要谨慎使用多个语义制作线图。 虽然这样操作有时候提供了信息,但图表更难解读。 但即使您只检查一个附加变量的变化,更改线条的颜色和样式也很有用。 当打印成黑白或有色盲的人观看时,这可以使情节更容易理解:
sns.relplot(x='timepoint',
y = 'signal',
hue='event',
style='event',
kind='line',
data=fmri)
units
当您使用重复测量数据(即,您有多次采样的单位)时,您还可以单独绘制每个采样单位,而无需通过语义区分它们。这可以避免使图例混乱:
sns.relplot(x="timepoint",
y="signal",
hue="region",
units="subject",
estimator=None,
kind="line",
data=fmri.query("event == 'stim'"))
lineplot()中默认的色彩映射和图例处理还取决于色调hue是分类型数据还是数字型数据:
dots = pd.read_csv('dots.csv').query("align == 'dots'")
dots.head()
sns.relplot(x="time",
y="firing_rate",
hue="coherence",
style="choice",
kind="line",
data=dots)
调色板palette
可能会发生这样的情况:即使色调变量palette是数字,它也很难用线性色标表示。 这就是这种情况,其中色调变量hue以对数方式缩放。 您可以通过传递列表或字典为每一行提供特定的颜色值:
#n_colors值与coherence种类数相等
palette = sns.cubehelix_palette(light=.8, n_colors=6)
sns.relplot(x="time",
y="firing_rate",
hue="coherence",
style="choice",
palette=palette,
kind="line", data=dots);
hue_norm
或者您可以更改色彩映射的规范化方式
from matplotlib.colors import LogNorm
sns.relplot(x="time",
y="firing_rate",
hue="coherence",
hue_norm=LogNorm(),
style="choice",
kind="line",
data=dots);
size
改变线条的粗细
sns.relplot(x='time',
y='firing_rate',
size='coherence',
style='choice',
kind='line',
data=dots)
绘制date数据
df = pd.DataFrame(dict(time=pd.date_range("2017-1-1", periods=500),
value=np.random.randn(500).cumsum()))
df.head()
g = sns.relplot(x="time", y="value", kind="line", data=df)
g.fig.autofmt_xdate()
多图展现更多信息
当你想要理解两个变量之间的关系如何依赖于多个其他变量时呢?
最好的方法可能是制作一个以上的图。 因为relplot()基于FacetGrid,所以这很容易做到。 要显示新增变量的影响,而不是将其分配给绘图中的一个语义角色,请使用它来“构思”(facet)可视化。 这意味着您可以创建多个轴并在每个轴上绘制数据的子集:
tips = pd.read_csv('tips.csv')
sns.relplot(x="total_bill",
y="tip",
hue="smoker",
col="time", #time有几种值,就有几列图
data=tips);
sns.relplot(x="timepoint",
y="signal",
hue="subject",
col="region", #region有几种值,就有几列图
row="event", #event有几种值,就有几行图
height=3,
kind="line",
estimator=None,
data=fmri);
sns.relplot(x="timepoint",
y="signal",
hue="event",
style="event",
col="subject",
col_wrap=3, #显示的图片的行数
height=3,
aspect=1, #长宽比,该值越大图片越方。
linewidth=2.5,
kind="line",
data=fmri.query("region == 'frontal'"));