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/4585467092d398f43f7582a1a927a2599f6e93cd805391df2dab56952895a156.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/ef9ae500d37e884b87c3cf41bebbe29b602a6017ec9910ab23098a99dc697582.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/8ce64354e7086844d1810da41b213a5ff941af2206ec35873c78a1677bd0e020.png
sns.catplot(x="pclass", y="survived", hue="sex", data=titanic)  # 在分面栅格上绘制分类图
<seaborn.axisgrid.FacetGrid at 0x7f60549319d0>
../_images/ae231e0acd00b0817a420e0cd8266a55588cf63c2e3a6d2f49c7ab3b1592e9b8.png
sns.lmplot(
    x="sepal_width", y="sepal_length", hue="species", data=iris
)  # 绘制适配分面栅格的数据与回归模型
<seaborn.axisgrid.FacetGrid at 0x7f6050e4b470>
../_images/cb395480f4a73253b1641d4daadd3f32d41b490d10cc36a4f95524bb144791ae.png
h = sns.PairGrid(iris)  # 绘制配对关系的子图栅格
h = h.map(plt.scatter)  # 绘制配对的双变量分布
../_images/34f9d9cf0784dc65e6acc9df0ec72dee716a553dc32f9fbbcc90d6e9e908b702.png
sns.pairplot(iris)  # 绘制双变量图的边际单变量图栅格
<seaborn.axisgrid.PairGrid at 0x7f606304f170>
../_images/354fb8c8c3fa360c41091eecac83ed567aa6543eeed466af677daf54f29899f5.png
i = sns.JointGrid(x="x", y="y", data=data)
i = i.plot(sns.regplot, sns.jointplot)
../_images/d787635696d49f5955fc2e87bb4e854cff14ed50d27c05c650b1b7978535b0ef.png ../_images/d45b60e1daa55102ecb62fc0eaf228ca41ebf8036ebcf41e680ca4c5999bbac9.png ../_images/adb58ef834ce9abe91981474211eef255a2aa67f407e6a52d5ef36725cef2e95.png

各类图形#

散点图

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

条形图

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

计数图

sns.countplot(x="deck", data=titanic, palette="Greens_d")  # 显示观测数量
<Axes: xlabel='deck', ylabel='count'>
../_images/20b1762888aa0c540a64d404b22ea569bcebd2b19b4bd46aedc917bc8a864a0f.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/56882afe339b62286b206ccb064d65152d11a235eeb31be27a9931bb29010d83.png

箱形图

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

小提琴图

sns.violinplot(x="age", y="sex", hue="survived", data=titanic)  # 小提琴图
<Axes: xlabel='age', ylabel='sex'>
../_images/c9c3dd16917c5bdd307756d853018add5feaf8c84d53b6871afd5ea4eff401bb.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/36302a8921cb3ace0c907c271272b44acee7fb363cbaa27551d0eb7c59c1fe3a.png

矩阵图#

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

深度自定义#

Axisgrid对象#

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

图形#

plt.title("A Title")  # 添加图形标题
Text(0.5, 1.0, 'A Title')
../_images/20f16793ad84b7e2068fb7badf7945edec1b75469fd2239441c428415c257835.png
plt.ylabel("Survived")  # 调整 Y 轴标签
Text(0, 0.5, 'Survived')
../_images/8dc29c0d322b10cb1a1f90c7aa360c98449dd87d74dcfe3b458494666eb84bdd.png
plt.xlabel("Sex")  # 调整 X 轴标签
Text(0.5, 0, 'Sex')
../_images/191f76cd4cd2a21f4cd350870d6f28e00602789e116f57374c16fb28e1aa02c1.png
plt.ylim(0, 100)  # 调整 Y 轴幅度区间
(0.0, 100.0)
../_images/bb88cb4b70f2bb374de9026a2576d43605ebbb1ab2a70427e7baad94e4260290.png
plt.xlim(0, 10)  # 调整 X 轴幅度区间
(0.0, 10.0)
../_images/7f1f7fdee2614e4df070ba537aacaa2bb9121fed88739fbd5995d681de93b624.png
plt.setp(ax, yticks=[0, 5])  # 调整图形属性
[<matplotlib.axis.YTick at 0x7f605128e180>,
 <matplotlib.axis.YTick at 0x7f6051226e40>]
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/3504231033b2385b7b0bcc4cb08dc904de90f7e59e151973c7710a500f5aff4e.png
plt.clf()  # 清除画布
<Figure size 640x480 with 0 Axes>
plt.close()  # 关闭窗口