官方seaborn教程
统计分析是了解数据集中的变量如何相互关联以及这些关系如何依赖于其他变量的过程。可视化可以是此过程的核心组件,因为当数据可视化时,人类视觉系统可以看到指示关系的趋势和模式。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")
散点图是统计可视化的支柱。它描绘了使用点云的两个变量的联合分布,其中每个点代表数据集中的观察。这种描述允许眼睛推断出关于它们之间是否存在任何有意义关系的大量信息。
#有几种方法可以在seaborn中绘制散点图。当两个变量都是数字时应该使用的最基本的是scatterplot()函数。
图1:左上 图2:右上 图3:左下 图4:右下
# 绘制散点图 图1
tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", data=tips);
# 虽然这些点是以二维绘制的,但可以通过根据第三个变量对点进行着色来将另一个维度
# 添加到绘图中。在seaborn中,这被称为使用“色调语义”,因为该点的颜色获得意义
# 图2
sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips);
# 要强调类之间的差异并改善可访问性,可以为每个类使用不同的标记样式 图3
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips);
# 通过独立地改变每个点的色调和样式,也可以表示四个变量。但这应该仔细进行,
# 因为眼睛对形状的敏感性要小于颜色 图4
sns.relplot(x="total_bill", y="tip", hue="smoker", style="time", data=tips);
# 在上面的示例中,色调语义是分类的,因此应用了默认的定性调色板。
# 如果色调语义是数字的(具体来说,如果它可以转换为浮动),则默认着色切换到顺序调色板
# 图1
sns.relplot(x="total_bill", y="tip", hue="size", data=tips);
# 使用字符串接口自定义顺序调色板cubehelix_palette() 图2
sns.relplot(x="total_bill", y="tip", hue="size", palette="ch:r=-.5,l=.75", data=tips);
# 第三种语义变量改变了每个点的大小 图3
sns.relplot(x="total_bill", y="tip", size="size", data=tips);
# 与matplotlib.pyplot.scatter()不同,变量的文字值不用于选择点的区域
# 相反,数据单元中的值范围被归一化为面积单位的范围 图4
sns.relplot(x="total_bill", y="tip", size="size", sizes=(15, 200), data=tips);
scatterplot()API示例中显示了用于自定义如何使用不同语义来显示统计关系的更多示例。
对于某些数据集,您可能希望了解一个变量中的变化作为时间的函数,或者类似的连续变量。在这种情况下,一个很好的选择是绘制线图。在seaborn中,这可以通过lineplot()函数实现或直接在relplot()函数中设置kind="line"实现。
# 图1
df = pd.DataFrame(dict(time=np.arange(500),
value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", kind="line", data=df)
g.fig.autofmt_xdate()
# 由于lineplot()假设绘制x的函数y,因此默认x在绘图之前按值对数据进行排序
# 但是,这可以被禁用 图2
df = pd.DataFrame(np.random.randn(500, 2).cumsum(axis=0), columns=["x", "y"])
sns.relplot(x="x", y="y", sort=False, kind="line", data=df);
# seaborn中默认通过绘制平均值和平均值周围的95%置信区间来聚合每个值的多个测量值
# 图1
fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint", y="signal", kind="line", data=fmri);
# 置信区间用bootstrapping取样,对于较大的数据集可能会很耗时,所以可以被禁止
# 图2
sns.relplot(x="timepoint", y="signal", ci=None, kind="line", data=fmri);
# 对于较大的数据,应该通过绘制标准偏差而不是置信区间来表示每个时间点的分布范围
# 图3
sns.relplot(x="timepoint", y="signal", kind="line", ci="sd", data=fmri);
# 要完全关闭聚合,请将estimator参数设置为“None”。当数据在每个点上有多个观察值时
# 这可能会产生奇怪的效果
sns.relplot(x="timepoint", y="signal", estimator=None, kind="line", data=fmri);
# 使用语义lineplot()可以确定数据如何聚合
# 添加具有两个级别的色调语义将绘图分成两行和错误带,每个都着色以指示它们对应于哪个数据子集
# 图1
sns.relplot(x="timepoint", y="signal", hue="event", kind="line", data=fmri);
# 在行图中添加样式语义会默认更改行中的破折号模式 图2
sns.relplot(x="timepoint", y="signal", hue="region", style="event",
kind="line", data=fmri);
# 可以通过每次观察时使用的标记识别子集,或者使用短划线或代替它们
sns.relplot(x="timepoint", y="signal", hue="region", style="event",
dashes=False, markers=True, kind="line", data=fmri);
# 与散点图一样,要谨慎使用多个语义制作线图
sns.relplot(x="timepoint", y="signal", hue="event", style="event",
kind="line", data=fmri);
# 当使用重复测量数据(即有多次采样的单位)时,可以单独绘制每个采样单位
# 而无需通过语义区分它们。这样可以避免使图例混乱 图1
sns.relplot(x="timepoint", y="signal", hue="region",
units="subject", estimator=None,
kind="line", data=fmri.query("event == 'stim'"));
# 默认lineplot()的色彩映射和图例的处理还取决于色调语义是分类还是数字 图2
dots = sns.load_dataset("dots").query("align == 'dots'")
sns.relplot(x="time", y="firing_rate",
hue="coherence", style="choice",
kind="line", data=dots);
更多参数见官网:http://seaborn.pydata.org/tutorial/relational.html
线图通常用于可视化与实际日期和时间相关的数据。这些函数以原始格式将数据传递给底层的matplotlib函数,因此他们可以利用matplotlib在tick标签中设置日期格式的功能。但是所有这些格式化都必须在matplotlib层进行,你应该参考matplotlib文档来看看它是如何工作的。
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()
当想要了解两个变量之间的关系如何依赖于多个其他变量时,即要显示附加变量的影响,而不是将其分配给绘图中的一个语义角色,则要它来“构思”可视化。这意味着可以创建多个轴并在每个轴上绘制数据的子集。
sns.relplot(x="total_bill", y="tip", hue="smoker",
col="time", data=tips);
还可以通过这种方式显示两个变量的影响:一个是通过在列上分面而另一个是在行上分面。当开始向网格添加更多变量时,你可能希望减小数字大小。请记住,尺寸FacetGrid是通过每个面的高度和纵横比参数化的。
sns.relplot(x="timepoint", y="signal", hue="subject",
col="region", row="event", height=3,
kind="line", estimator=None, data=fmri);
当想要检查变量的多个级别的效果时,最好在列上面对该变量,然后将facet“包装”到行中。
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'"));
这些可视化通常被称为“点阵”图或“小倍数”,它们非常有效,因为它们以一种格式呈现数据,使眼睛易于检测整体模式和与这些模式的偏差。