Seaborn#

导入工具库#

用Seaborn绘制统计型数据可视图

Seaborn是基于matplotlib开发的高阶Python数据可视图库,用于绘制优雅、美观的统计图形。

使用下列别名导入该库:

import warnings

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

warnings.filterwarnings('ignore')

使用 Seaborn 创建图形的基本步骤:

  • Step 1 准备数据

  • Step 2 设定画布外观

  • Step 3 使用 Seaborn 绘图

  • Step 4 自定义图形

  • Step 5 展示结果图

tips = pd.read_csv("../_static/dataset/tips.csv")
# tips = sns.load_dataset("tips")  # Step 1
sns.set_style("whitegrid")  # Step 2
g = sns.lmplot(x="tip", y="total_bill", data=tips, aspect=2)  # Step 3
g = g.set_axis_labels("Tip", "Total bill(USD)").set(xlim=(0, 10), ylim=(0, 100))
plt.title("title")  # Step 4
plt.show(g)  # Step 5
../_images/3e5d4f22b673444e8de6e4fa3ab62664a0065de57baf5237332a164549be7e32.png

数据准备#

可以是numpy数组和Dataframe等数据格式

import pandas as pd
import numpy as np
uniform_data = np.random.rand(10, 12)
data = pd.DataFrame({"x": np.arange(1, 101), "y": np.random.normal(0, 4, 100)})

Seaborn 提供了内置数据集:

titanic = pd.read_csv("../_static/dataset/titanic.csv")
iris = pd.read_csv("../_static/dataset/iris.csv")

画布外观#

f, ax = plt.subplots(figsize=(5, 6))  # 创建画布与子图
../_images/3bb3a78ad2842e9206eabfdf246c7069091654f9edf6470e114ec98a667cc77c.png

Seaborn 样式#

sns.set()  # 设置或重置 Seaborn 默认值
sns.set_style("whitegrid")  # 设置 matplotlib 参数
sns.set_style("ticks", {"xtick.major.size": 8, "ytick.major.size": 8})  # 设置 matplotlib 参数
sns.axes_style("whitegrid")  # 返回参数字典或用 with 设置临时样式
{'figure.facecolor': 'white',
 'axes.labelcolor': '.15',
 'xtick.direction': 'out',
 'ytick.direction': 'out',
 'xtick.color': '.15',
 'ytick.color': '.15',
 'axes.axisbelow': True,
 'grid.linestyle': '-',
 'text.color': '.15',
 'font.family': ['sans-serif'],
 'font.sans-serif': ['Arial',
  'DejaVu Sans',
  'Liberation Sans',
  'Bitstream Vera Sans',
  'sans-serif'],
 'lines.solid_capstyle': 'round',
 'patch.edgecolor': 'w',
 'patch.force_edgecolor': True,
 'image.cmap': 'rocket',
 'xtick.top': False,
 'ytick.right': False,
 'axes.grid': True,
 'axes.facecolor': 'white',
 'axes.edgecolor': '.8',
 'grid.color': '.8',
 'axes.spines.left': True,
 'axes.spines.bottom': True,
 'axes.spines.right': True,
 'axes.spines.top': True,
 'xtick.bottom': False,
 'ytick.left': False}

上下文函数#

sns.set_context("talk")  # 将上下文设置为 "talk"
sns.set_context(
    "notebook", font_scale=1.5, rc={"lines.linewidth": 2.5}
)  # 上下文设为 "notebook",缩放字体,覆盖参数映射

调色板#

sns.set_palette("husl", 3)  # 定义调色板
sns.color_palette("husl")  # 使用 with 临时设置调色板
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.set_palette(flatui)  # 设置调色板

使用Seaborn绘图#

坐标轴栅格#

g = sns.FacetGrid(titanic, col="survived", row="sex")  # 绘制条件关系的子图栅格
g = g.map(plt.hist, "age")
../_images/d8d3d47fcebd9b6834cbf3e9848d3ecaf29f4cb2d727cb36e12972db48c1ef58.png
sns.catplot(x="pclass", y="survived", hue="sex", data=titanic)  # 在分面栅格上绘制分类图
<seaborn.axisgrid.FacetGrid at 0x7f25825795e0>
../_images/471c6d5c47a3dba2109886c507935b7538a9d3e3be16649b20fc0743654f5ecd.png
sns.lmplot(
    x="sepal_width", y="sepal_length", hue="species", data=iris
)  # 绘制适配分面栅格的数据与回归模型
<seaborn.axisgrid.FacetGrid at 0x7f2584711310>
../_images/2d4e3f5db8dbc7a0cb569705d0b9c39fa624557202495cba4f481085a6ec5688.png
h = sns.PairGrid(iris)  # 绘制配对关系的子图栅格
h = h.map(plt.scatter)  # 绘制配对的双变量分布
../_images/48e41abe7972c315451edede029137524b5072479a82eedfe2aded4687180fcc.png
sns.pairplot(iris)  # 绘制双变量图的边际单变量图栅格
<seaborn.axisgrid.PairGrid at 0x7f25822433b0>
../_images/4ced2e0433386ffd56c81b1907b9b2186e1d93a93735d1a194337768b2566ad5.png
i = sns.JointGrid(x="x", y="y", data=data)
i = i.plot(sns.regplot, sns.jointplot)
../_images/17d63a2a47d028d22bea733593821b83f63ef310db416df9c3b72947753b183f.png ../_images/d8a575048644c455a4dad1db1ec184c3ed86585f706354412a634965a635b361.png ../_images/8f5e388c84ce818bcdc6e146410374320644e97718906d04a2507562d666e46f.png

各类图形#

散点图

sns.stripplot(x="species", y="petal_length", data=iris)  # 含分类变量的抖动图
<Axes: xlabel='species', ylabel='petal_length'>
../_images/fc26124c539845f77d04e35ecd61c9b21f6ae15e2df3feea81cdff08d6213a60.png
sns.swarmplot(x="species", y="petal_length", data=iris)  # 不重叠分类蜂群图
<Axes: xlabel='species', ylabel='petal_length'>
../_images/c18fa5911729ac54791fca010274d274b6379c7f269cf9a7323c4ae53d32966e.png

条形图

sns.barplot(x="sex", y="survived", hue="class", data=titanic)  # 用散点图示符显示点估计值和置信区间
<Axes: xlabel='sex', ylabel='survived'>
../_images/71fd4affadc38a8cca796156889fed7606d8c4ae4f0875c5fb90f2e8b263d2e3.png

计数图

sns.countplot(x="deck", data=titanic, palette="Greens_d")  # 显示观测数量
<Axes: xlabel='deck', ylabel='count'>
../_images/d74a8aaa98b44807f76ed5b00d6e6d17f96c6d9c9f3b8242acfc5898ec5eb75f.png

点图

sns.pointplot(
    x="class",
    y="survived",
    hue="sex",
    data=titanic,
    palette={"male": "g", "female": "m"},
    markers=["^", "o"],
    linestyles=["-", "--"],
)  # 显示点估计和置信区间
<Axes: xlabel='class', ylabel='survived'>
../_images/63097ca8e3660af2e2da131b07b29265fcebd3028cec565d484c49920600ce5c.png

箱形图

sns.boxplot(x="alive", y="age", hue="adult_male", data=titanic)  # 箱形图
<Axes: xlabel='alive', ylabel='age'>
../_images/b4e385ad36f3c6f4050aa414773b8ea8db5a3949601c731e045b69f11b2d9bb0.png
sns.boxplot(data=iris, orient="h")  # 使用宽表数据的箱形图
<Axes: >
../_images/3dbe95aea62bc93ea31c14af316b89b433368773aed91bfe0890fba6a1d9f71d.png

小提琴图

sns.violinplot(x="age", y="sex", hue="survived", data=titanic)  # 小提琴图
<Axes: xlabel='age', ylabel='sex'>
../_images/817328a1f55e5769196bf7afed7534f21b140e7ee7679db2b6baca8f9402c7a9.png

回归图#

sns.regplot(x="sepal_width", y="sepal_length", data=iris, ax=ax)  # 绘制与线性回归模型拟合的数据
<Axes: xlabel='sepal_width', ylabel='sepal_length'>

分布图#

plot = sns.distplot(data.y, kde=False, color="b")  # 绘制单变量分布
../_images/24b15de2df5d561c40d7338a563418df21f15a677f33461e44a007131460c937.png

矩阵图#

sns.heatmap(uniform_data, vmin=0, vmax=1)  # 热力图
<Axes: >
../_images/f67a469841a914b2c7484f49fe082273c336793b4fb4f4283a94914ee1db4982.png

深度自定义#

Axisgrid对象#

g.despine(left=True)  # 移除左框
<seaborn.axisgrid.FacetGrid at 0x7f2584a680e0>
g.set_ylabels("Survived")  # 设置 Y 轴标签
<seaborn.axisgrid.FacetGrid at 0x7f2584a680e0>
g.set_xticklabels(rotation=45)  # 设置 X 轴刻度标签
<seaborn.axisgrid.FacetGrid at 0x7f2584a680e0>
g.set_axis_labels("Survived", "Sex")  # 设置坐标轴标签
<seaborn.axisgrid.FacetGrid at 0x7f2584a680e0>
h.set(
    xlim=(0, 5), ylim=(0, 5), xticks=[0, 2.5, 5], yticks=[0, 2.5, 5]
)  # 设置 X 与 Y 轴的幅度区间和刻度
<seaborn.axisgrid.PairGrid at 0x7f25d437b3b0>

图形#

plt.title("A Title")  # 添加图形标题
Text(0.5, 1.0, 'A Title')
../_images/4b17f2d4431f89f488472efca01be569aeb7f58c70846886e480d0f309c015c6.png
plt.ylabel("Survived")  # 调整 Y 轴标签
Text(0, 0.5, 'Survived')
../_images/5cecdb755cb41836756961922a0e540282f92d917f3225e5e8d2814da924a766.png
plt.xlabel("Sex")  # 调整 X 轴标签
Text(0.5, 0, 'Sex')
../_images/13f44fadb04950d3c443fbb81be4b4e8a1b754329a76cbe917e86fde94835ccc.png
plt.ylim(0, 100)  # 调整 Y 轴幅度区间
(0.0, 100.0)
../_images/516c47e283e18e319040edae9e439cdc3a681f758ea842ad8b7ae5214df751e1.png
plt.xlim(0, 10)  # 调整 X 轴幅度区间
(0.0, 10.0)
../_images/f71f46730634a6e85741cae3665c0a22cc92932c37c37bfb25e46e27966291fb.png
plt.setp(ax, yticks=[0, 5])  # 调整图形属性
[<matplotlib.axis.YTick at 0x7f2582522f60>,
 <matplotlib.axis.YTick at 0x7f2584bcb3e0>]
plt.tight_layout()  # 调整子图参数
<Figure size 640x480 with 0 Axes>

显示或保存图形#

show与savefig函数

plt.show()  # 显示图形
plt.savefig("../_tmp/plt_savefig.png")  # 将画布保存为图形
<Figure size 640x480 with 0 Axes>
plt.savefig("../_tmp/plt_savefig_transparent.png", transparent=True)  # 保存透明画布
<Figure size 640x480 with 0 Axes>

关闭与清除#

绘图关闭与清除操作

plt.cla()  # 清除坐标轴
../_images/df741375d462c5308b85c4f7c91269a530074469d3fc0908b3f59002a1fb415c.png
plt.clf()  # 清除画布
<Figure size 640x480 with 0 Axes>
plt.close()  # 关闭窗口