首先导入工具包并执行魔法指令:
import numpy as np
import pandas as pd
import seaborn as sns
from scipy import stats
import matplotlib as mpl
import matplotlib.pyplot as plt
sns.set(style="ticks")
%matplotlib inline
导入今天使用的数据集 tips :
tips = sns.load_dataset("tips")
tips.head()
数据集如下:
今天我们介绍的工具是 FacetGrid ,可将变量不同类型的值绘制在多个子图中。
g = sns.FacetGrid(tips, col="time")
将会根据 tips 数据集中 time 的类型,创建 n 列子图:
使用 g.map
即可在各子图上绘制指定图形。
g.map(plt.hist, "tip")
在各个子图上绘制小费 tip 分布的直方图:
在创建子图时,使用 hue
关键字参数可以指定每张子图在绘制时,是否需要按指定的特征分不同颜色绘制:
g = sns.FacetGrid(tips, col="sex", hue="smoker")
g.map(plt.scatter, "total_bill", "tip", alpha=0.7)
g.add_legend()
在分别描述男性和女性 total_bill 和 tip 关系的时候,还会按照是否吸烟,将散点图按不同颜色区分:
创建子图时,除了指定行的分类,还可以指定类的分类:
g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)
g.map(sns.regplot, "size", "total_bill", fit_reg=True, x_jitter=0.2)
下面是 size 和 total_bill 的线性回归分析绘图,关于 sns.regplot
的控制参数,都可以在 g.map
中传入。
在创建子图时,可以使用 height
以及宽高比 aspect
控制每张子图的大小:
g = sns.FacetGrid(tips, col="day", height=4, aspect=0.5)
g.map(sns.barplot, "sex", "total_bill", order=tips.sex.value_counts().index)
绘制柱形图 sns.barplot
需要指定 order
,即柱子的顺序:
>>> tips.sex.value_counts()
Male 157
Female 87
Name: sex, dtype: int64
绘制结果:每张子图中,Male 在前,Female 在后:
此外,还可以指定子图的顺序,使用关键字参数 row_order
或者 col_order
即可。
比如,我们需要以子图的形式显示每天消费总额 total_bill 分布的直方图。我们先看看数据集提供了一周中那些天的数据:
>>> tips.day.value_counts()
Sat 87
Sun 76
Thur 62
Fri 19
Name: day, dtype: int64
下面,我们横着创建 4 张子图进行绘制:
from pandas import Categorical
ordered_days = Categorical(['Thur', 'Fri', 'Sat', 'Sun'])
g = sns.FacetGrid(tips, row="day", row_order=ordered_days, height=1.7, aspect=2)
g.map(sns.histplot, "total_bill")
绘制结果:
创建 FaceGrid 时可以指定使用的调色板:
pal = dict(Lunch="seagreen", Dinner="red")
g = sns.FacetGrid(tips, hue="time", palette=pal, height=5, aspect=1.2)
g.map(plt.scatter, "total_bill", "tip", s=50, alpha=0.6, linewidth=0.5, edgecolor="white")
g.add_legend()
绘制结果:
还可以指定 marker
:
g = sns.FacetGrid(
tips, hue="sex",
palette=sns.hls_palette(2, l=0.7, s=0.9),
hue_kws={"marker": ["^", "v"]},
height=5,
aspect=1.2
)
g.map(plt.scatter, "total_bill", "tip", s=100, linewidth=0.5, edgecolor="white")
g.add_legend()
绘制结果:
使用 g
对象,可以对子图的坐标轴名称,刻度,子图间的距离等进行设定:
with sns.axes_style("white"):
g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, height=2.5)
g.map(plt.scatter, "total_bill", "tip", color="#334488", edgecolor="white", lw=0.5);
g.set_axis_labels("Total bill (US Dollars)", "Tip")
g.set(xticks=[10, 30, 50], yticks=[2, 6, 10])
g.fig.subplots_adjust(wspace=0.2, hspace=0.1)
绘制结果: