在探索中等维度数据时,经常需要在数据集的不同子集上绘制同一类型图的多个实例,这种技术有时被称为“网格”绘图,可以从复杂数据中快速提取大量信息。Matplotlib 为此提供了很好的支持,seaborn 构建于此之上,可直接将绘图结构和数据集结构关系起来。
要使用网格图功能,数据必须是 Pandas 数据框的形式,且为整洁形式,即用来绘图的数据框应该为每列一个变量,每一行一个观察的形式。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
sns.set(style='whitegrid', color_codes=True)
plt.rc(
"figure",
autolayout=True,
figsize=(6, 5),
titlesize=18,
titleweight='bold',
)
plt.rc(
"axes",
labelweight="bold",
labelsize="large",
titleweight="bold",
titlesize=16,
titlepad=10,
)
%config InlineBackend.figure_format = 'retina'
warnings.filterwarnings('ignore')
基于一定条件的多重小图
当我们想在数据集的不同子集中分别可视化变量分布或多个变量之间的关系时,就需要用到FacetGrid
类,它最多有三个维度:row
、col
和hue
。前两者与轴阵列对应;色调变量hue
为第三个维度,不同级别采用不同的颜色绘制。
首先,使用数据框初始化FacetGrid
对象并指定将形成网格的行、列或色调维度的变量名称。这些变量应是离散的,然后对应于变量不同取值的数据将用于绘制沿该轴的不同小平面。relplot()
、catplot()
和lmplot()
都在内部使用此对象,并且它们在完成时返回该对象,以便进一步调整。
tips = sns.load_dataset('tips', data_home='data', cache=True)
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 |
g = sns.FacetGrid(tips, col='time')
g.map(plt.hist, 'tip')
<seaborn.axisgrid.FacetGrid at 0x1351587d0>
map
函数绘制图形并注释轴,生成图。要绘制关系图,只需传递多个变量名称。还可以提供关键字参数,这些参数将传递给绘图函数。
g = sns.FacetGrid(tips, col='sex', hue='smoker')
g.map(plt.scatter, 'total_bill', 'tip', alpha