[数学建模从入门到入土] seaborn例图
个人导航
知乎:https://www.zhihu.com/people/byzh_rc
CSDN:https://blog.csdn.net/qq_54636039
注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码
参考文章:https://seaborn.pydata.org/examples/index.html
文章目录
- [[数学建模从入门到入土] seaborn例图](#[数学建模从入门到入土] seaborn例图)
- 个人导航
- [散点图 scatterplot](#散点图 scatterplot)
- [线性图 lineplot](#线性图 lineplot)
- [条形图 barplot](#条形图 barplot)
- [直方图 histplot](#直方图 histplot)
- [核密度估计图 kdeplot](#核密度估计图 kdeplot)
- [分布图 displot](#分布图 displot)
- [箱线图 boxplot](#箱线图 boxplot)
- [小提琴图 violinplot](#小提琴图 violinplot)
- [热力图 heatmap](#热力图 heatmap)
- [关系图 relplot](#关系图 relplot)
- [分类图 catplot](#分类图 catplot)
- [成对关系图 pairplot](#成对关系图 pairplot)
散点图 scatterplot
适用于显示数据点之间的关系,尤其是两个连续变量之间的关系
py
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid")
# 钻石数据集
diamonds = sns.load_dataset("diamonds")
# 制散点图,同时将点颜色和大小映射到数据集中的不同变量
f, ax = plt.subplots(figsize=(6.5, 6.5))
sns.despine(f, left=True, bottom=True)
clarity_ranking = ["I1", "SI2", "SI1", "VS2", "VS1", "VVS2", "VVS1", "IF"]
sns.scatterplot(x="carat", y="price",
hue="clarity", size="depth",
palette="ch:r=-.2,d=.3_r",
hue_order=clarity_ranking,
sizes=(1, 8), linewidth=0,
data=diamonds, ax=ax)
plt.show()

线性图 lineplot
显示变量随时间或顺序变化的趋势
py
import seaborn as sns
from matplotlib import pyplot as plt
sns.set_theme(style="darkgrid")
# 加载一个包含长格式数据的示例数据集
fmri = sns.load_dataset("fmri")
# 绘制不同事件和区域的响应信号
sns.lineplot(x="timepoint", y="signal",
hue="region", style="event",
data=fmri)
plt.show()

条形图 barplot
显示分类数据的数量或大小比较,能够直观显示各类别的相对比例
py
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="white", context="talk")
rs = np.random.RandomState(8)
# 设置 matplotlib 图形
f, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(7, 5), sharex=True)
# 生成一些有序数据
x = np.array(list("ABCDEFGHIJ"))
y1 = np.arange(1, 11)
sns.barplot(x=x, y=y1, hue=x, palette="rocket", ax=ax1)
ax1.axhline(0, color="k", clip_on=False)
ax1.set_ylabel("Sequential")
# 将数据中心化以使其成为发散数据
y2 = y1 - 5.5
sns.barplot(x=x, y=y2, hue=x, palette="vlag", ax=ax2)
ax2.axhline(0, color="k", clip_on=False)
ax2.set_ylabel("Diverging")
# 随机重新排列数据以使其成为定性数据
y3 = rs.choice(y1, len(y1), replace=False)
sns.barplot(x=x, y=y3, hue=x, palette="deep", ax=ax3)
sns.barplot(x=x, y=y3, hue=x, palette="deep", ax=ax3)
ax3.axhline(0, color="k", clip_on=False)
ax3.set_ylabel("Qualitative")
# 完成图形绘制
sns.despine(bottom=True)
plt.setp(f.axes, yticks=[])
plt.tight_layout(h_pad=2)
plt.show()

直方图 histplot
用于显示连续数据的分布情况。
能够直观展示数据的频率分布,适合用于探索数据的整体分布或检验数据是否符合某种分布。
py
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
sns.set_theme(style="ticks")
diamonds = sns.load_dataset("diamonds")
f, ax = plt.subplots(figsize=(7, 5))
sns.despine(f)
sns.histplot(
diamonds,
x="price", hue="cut",
multiple="stack",
palette="light:m_r",
edgecolor=".3",
linewidth=.5,
log_scale=True,
)
ax.xaxis.set_major_formatter(mpl.ticker.ScalarFormatter())
ax.set_xticks([500, 1000, 2000, 5000, 10000])
plt.show()

核密度估计图 kdeplot
用于估计连续数据的概率密度。相对于直方图,它更平滑,适合于分析数据的分布模式。
py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")
iris = sns.load_dataset("iris")
# 设置图形
f, ax = plt.subplots(figsize=(8, 8))
ax.set_aspect("equal")
# 绘制等高线图以表示每个二元密度
sns.kdeplot(
data=iris.query("species != 'versicolor'"), # 筛选除 versicolor 以外的数据
x="sepal_width",
y="sepal_length",
hue="species",
thresh=.1,
)
plt.tight_layout()
plt.show()

分布图 displot
适合用于展示一个变量的分布,并支持多种形式的分布(如直方图、核密度估计、ECDF等)。
适用于分层数据的比较。
py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")
df = sns.load_dataset("penguins")
sns.displot(
df, x="flipper_length_mm", col="species", row="sex",
binwidth=3, height=3, facet_kws=dict(margin_titles=True),
)
plt.show()

py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="ticks")
mpg = sns.load_dataset("mpg")
colors = (250, 70, 50), (350, 70, 50)
cmap = sns.blend_palette(colors, input="husl", as_cmap=True)
sns.displot(
mpg,
x="displacement", col="origin", hue="model_year",
kind="ecdf", aspect=.75, linewidth=2, palette=cmap,
)
plt.show()

箱线图 boxplot
用于展示数据的分布和离群值。
通过显示数据的四分位数(Q1、Q2、Q3)、极值和中位数等信息,能够很清晰地表达数据的集中趋势和变异性。
py
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks")
# 初始化图形,并设置 x 轴为对数刻度
f, ax = plt.subplots(figsize=(7, 6))
ax.set_xscale("log")
# 加载示例行星数据集
planets = sns.load_dataset("planets")
# 使用水平箱线图绘制轨道周期
sns.boxplot(
planets, x="distance", y="method", hue="method",
whis=[0, 100], width=.6, palette="vlag"
)
# 添加散点以显示每个观测值
sns.stripplot(planets, x="distance", y="method", size=4, color=".3")
# 调整视觉呈现效果
ax.xaxis.grid(True) # 显示 x 轴网格线
ax.set(ylabel="") # 隐藏 y 轴标签
sns.despine(trim=True, left=True) # 移除左侧边框,并修剪坐标轴范围
plt.tight_layout()
plt.show()

小提琴图 violinplot
比箱线图更加详细,能够显示数据的密度分布。适用于对比多个类别之间的数据分布情况。
py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="dark")
# 加载示例小费数据集
tips = sns.load_dataset("tips")
# 绘制嵌套的小提琴图,并拆分小提琴以便于比较
sns.violinplot(data=tips, x="day", y="total_bill", hue="smoker",
split=True, inner="quart", fill=False,
palette={"Yes": "g", "No": ".35"})
plt.show()

热力图 heatmap
用于展示变量之间的相关性。
py
from string import ascii_letters
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="white")
# 生成一个大型随机数据集
rs = np.random.RandomState(33)
d = pd.DataFrame(data=rs.normal(size=(100, 26)),
columns=list(ascii_letters[26:]))
# 计算相关系数矩阵
corr = d.corr()
# 生成一个用于遮蔽上三角的掩码
mask = np.triu(np.ones_like(corr, dtype=bool))
# 设置 matplotlib 图形
f, ax = plt.subplots(figsize=(11, 9))
# 生成自定义的离散化颜色映射
cmap = sns.diverging_palette(230, 20, as_cmap=True)
# 使用掩码和正确的纵横比绘制热力图
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
plt.tight_layout()
plt.show()

关系图 relplot
用于展示数据中两个或多个变量之间的关系。适合分析多个维度之间的相互关系。
py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="whitegrid")
# 加载大脑网络数据集,选择子集,并展平多级索引
df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0)
# 定义要使用的网络编号列表
used_networks = [1, 5, 6, 7, 8, 12, 13, 17]
# 筛选出属于指定网络的列数据
used_columns = (df.columns
.get_level_values("network")
.astype(int)
.isin(used_networks))
df = df.loc[:, used_columns]
# 将多级列名合并为单级(用"-"连接)
df.columns = df.columns.map("-".join)
# 计算相关系数矩阵并将其转换为长格式
corr_mat = df.corr().stack().reset_index(name="correlation")
# 将每个单元格绘制为具有不同大小和颜色的散点
g = sns.relplot(
data=corr_mat,
x="level_0", y="level_1", hue="correlation", size="correlation",
palette="vlag", hue_norm=(-1, 1), edgecolor=".7",
height=10, sizes=(50, 250), size_norm=(-.2, .8),
)
# 调整图形以完成最终效果
g.set(xlabel="", ylabel="", aspect="equal") # 设置空标签和等比例坐标轴
g.despine(left=True, bottom=True) # 移除左侧和底部边框
g.ax.margins(.02) # 设置边距
for label in g.ax.get_xticklabels():
label.set_rotation(90) # 将 x 轴标签旋转90度
plt.show()

分类图 catplot
用于展示分类变量的分布和比较,适用于类别数据的可视化。
py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="whitegrid")
penguins = sns.load_dataset("penguins")
g = sns.catplot(
data=penguins, kind="bar",
x="species", y="body_mass_g", hue="sex",
errorbar="sd", palette="dark", alpha=.6, height=6
)
g.despine(left=True)
g.set_axis_labels("", "Body mass (g)")
g.legend.set_title("")
plt.show()

成对关系图 pairplot
用于展示数据集中各个变量之间的成对关系。适合用于多变量数据的可视化,能够同时查看多个变量间的关系。
py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="ticks")
df = sns.load_dataset("penguins")
sns.pairplot(df, hue="species")
plt.show()
