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/976cf818c037d839d0c3b116eb7cfc0550c76e320a61787efdeab66a30c8cef7.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/cece29da950798295d4be7c5fec153f55ff6fd21dcbb1f771278fbf3ac970752.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/923fb3deb15aa6f720b1a7325142b9b1466431ab8a87d31de38cc77477a93335.png
sns.catplot(x="pclass", y="survived", hue="sex", data=titanic)  # 在分面栅格上绘制分类图
<seaborn.axisgrid.FacetGrid at 0x7f36cdd42390>
../_images/aeaa87f1bdde017d38688465b9f7d851200c1f4985bc5ebcd9c7a1b89906b685.png
sns.lmplot(
    x="sepal_width", y="sepal_length", hue="species", data=iris
)  # 绘制适配分面栅格的数据与回归模型
<seaborn.axisgrid.FacetGrid at 0x7f36cddb03d0>
../_images/893a0cd044e40a4fc175d0606bd6a6bcf74f97767553354c55ee65cc7d0ec8d6.png
h = sns.PairGrid(iris)  # 绘制配对关系的子图栅格
h = h.map(plt.scatter)  # 绘制配对的双变量分布
../_images/adfed5c9e59d072ff3488af9efcb3876a3c9fbc2a2698b013abbff8b59ababe9.png
sns.pairplot(iris)  # 绘制双变量图的边际单变量图栅格
<seaborn.axisgrid.PairGrid at 0x7f36cde8e5d0>
../_images/757a6d6b4b023a20815c34537f681abae5d77e9071143a97a7b6db1cb658c6fe.png
i = sns.JointGrid(x="x", y="y", data=data)
i = i.plot(sns.regplot, sns.jointplot)
../_images/eb1076bd4407e2b928fb25307eadff65305103d5b40b60b49d3503ad1dc90cda.png ../_images/48f65a252de7815f05b41c2ac571c97a13bfd06c3cc112c619c496e4a76502e4.png ../_images/9b8e739041cf5fd7e8ad55c9d7f23d3f74cbaf0c931f6779f6d90fa79ae57e00.png

各类图形#

散点图

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

条形图

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

计数图

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

箱形图

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

小提琴图

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

矩阵图#

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

深度自定义#

Axisgrid对象#

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

图形#

plt.title("A Title")  # 添加图形标题
Text(0.5, 1.0, 'A Title')
../_images/375ecb2297b55a6621ba52614df078bff5838c49b53f75800dd7527b3bc52125.png
plt.ylabel("Survived")  # 调整 Y 轴标签
Text(0, 0.5, 'Survived')
../_images/a13ab9cc315d3683c30b1ba26ec4b1ed0c11988503ec1f4ce954298c94227d33.png
plt.xlabel("Sex")  # 调整 X 轴标签
Text(0.5, 0, 'Sex')
../_images/f48128a64fcd207f441196bc7f409f5cc2be8fcc64f0da16393bd3d4716f5e67.png
plt.ylim(0, 100)  # 调整 Y 轴幅度区间
(0.0, 100.0)
../_images/817140cea94dc55d5100f41d7c7c1f14252429f6e7cbc64afa04b8e906d0e70b.png
plt.xlim(0, 10)  # 调整 X 轴幅度区间
(0.0, 10.0)
../_images/1178ae0dbee054e6aabec2f5a133c8cebfd5c0f2d22c4f36c14fca4d32e5c506.png
plt.setp(ax, yticks=[0, 5])  # 调整图形属性
[<matplotlib.axis.YTick at 0x7f36cdf1d410>,
 <matplotlib.axis.YTick at 0x7f36cdf12d50>]
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/d4acfb27e6c14d523a1f683e9f1d12dd9c3539fdc45a76231d95f5db40e46c52.png
plt.clf()  # 清除画布
<Figure size 640x480 with 0 Axes>
plt.close()  # 关闭窗口