第七章:Seaborn高级应用


文档摘要

第七章:Seaborn高级应用 第七章:Seaborn高级应用 Seaborn作为Python数据可视化库中的佼佼者,建立在Matplotlib之上,提供了更高级的接口,使得创建美观且信息丰富的统计图形变得更加容易。前几章我们可能已经学习了Seaborn的基础绘图功能,例如散点图、直方图、箱线图等。本章我们将深入探讨Seaborn的高级应用,学习如何利用其强大的功能来处理更复杂的数据可视化需求,提升数据洞察力。 7.1 多变量数据可视化进阶:FacetGrid与PairGrid 当我们需要分析多变量数据时,简单的二维图形可能难以揭示变量之间的复杂关系。Seaborn提供了 和 这两个强大的类,用于创建多面板(multi-panel)图形,帮助我们从多个维度探索数据。 7.1.

第七章:Seaborn高级应用

第七章:Seaborn高级应用

Seaborn作为Python数据可视化库中的佼佼者,建立在Matplotlib之上,提供了更高级的接口,使得创建美观且信息丰富的统计图形变得更加容易。前几章我们可能已经学习了Seaborn的基础绘图功能,例如散点图、直方图、箱线图等。本章我们将深入探讨Seaborn的高级应用,学习如何利用其强大的功能来处理更复杂的数据可视化需求,提升数据洞察力。

7.1 多变量数据可视化进阶:FacetGrid与PairGrid

当我们需要分析多变量数据时,简单的二维图形可能难以揭示变量之间的复杂关系。Seaborn提供了 FacetGridPairGrid 这两个强大的类,用于创建多面板(multi-panel)图形,帮助我们从多个维度探索数据。

7.1.1 FacetGrid:条件关系网格

FacetGrid 用于创建条件关系网格,它允许我们根据一个或多个分类变量的水平,在不同的子图中绘制相同的图形。这对于观察不同条件下变量间的关系非常有用。

代码实践 7.1.1:使用 FacetGrid 分析小费数据

我们以Seaborn自带的 tips 数据集为例,分析不同用餐时间(time)和服务员性别(sex)下,总消费(total_bill)与小费(tip)之间的关系。

import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 tips = sns.load_dataset("tips") # 创建 FacetGrid 对象,按 'time' 和 'sex' 分面 g = sns.FacetGrid(tips, col="time", row="sex") # 在每个子图中绘制散点图,展示 'total_bill' 和 'tip' 的关系 g.map(sns.scatterplot, "total_bill", "tip") plt.suptitle("FacetGrid Example: Total Bill vs Tip by Time and Sex", y=1.02) # 添加总标题 plt.show()

代码详解 7.1.1:

  1. sns.load_dataset("tips"): 加载Seaborn内置的 tips 数据集,该数据集包含了餐厅顾客的小费信息。

  2. sns.FacetGrid(tips, col="time", row="sex"): 创建 FacetGrid 对象。

    • data=tips: 指定使用的数据集为 tips

    • col="time": 指定列分面变量为 time,即不同用餐时间(Lunch, Dinner)将分布在不同的列子图中。

    • row="sex": 指定行分面变量为 sex,即不同性别(Male, Female)将分布在不同的行子图中。

  3. g.map(sns.scatterplot, "total_bill", "tip"): 将绘图函数 sns.scatterplot 应用到每个子图。

    • sns.scatterplot: 指定在每个子图中绘制散点图。

    • "total_bill", "tip": 指定散点图的 x 轴和 y 轴变量。FacetGrid 会自动根据分面变量的组合,将数据子集传递给 sns.scatterplot

  4. plt.suptitle(...): 使用 Matplotlib 添加整个图形的标题,y=1.02 调整标题的垂直位置,避免与子图重叠。

  5. plt.show(): 显示图形。

mermaid 图 7.1.1:FacetGrid 结构

内容详解 7.1.1:FacetGrid 的工作原理

FacetGrid 的核心思想是根据指定的分类变量,将数据集分割成多个子集,并在网格的不同面板中对每个子集应用相同的绘图函数。

  • 分面变量 (Facet Variables): colrow 参数指定的分面变量决定了网格的结构。col 创建列方向的分面,row 创建行方向的分面。我们可以同时使用 colrow 来创建二维网格,也可以只使用其中一个来创建一维网格。

  • map() 方法: map() 方法是 FacetGrid 的关键。它接受一个绘图函数(例如 sns.scatterplot, sns.histplot)和要传递给该函数的变量名。FacetGrid 会自动迭代每个分面,并将对应的数据子集传递给指定的绘图函数,从而在每个子图中绘制图形。

  • 自定义子图: FacetGrid 返回一个 FacetGrid 对象,我们可以通过该对象的属性和方法进一步自定义子图的外观,例如修改轴标签、标题、图例等。

7.1.2 PairGrid:变量对关系网格

PairGrid 用于绘制变量对关系网格,它会针对数据集中的每对数值变量,绘制它们之间的关系图。这对于快速探索数据集中多个变量之间的两两关系非常有用。

代码实践 7.1.2:使用 PairGrid 分析鸢尾花数据

我们使用经典的 iris 数据集,分析不同鸢尾花品种(species)下,花萼长度(sepal_length)、花萼宽度(sepal_width)、花瓣长度(petal_length)、花瓣宽度(petal_width)两两之间的关系。

import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 iris = sns.load_dataset("iris") # 创建 PairGrid 对象,并指定 hue 分类变量 g = sns.PairGrid(iris, hue="species") # 对角线子图绘制直方图,非对角线子图绘制散点图 g.map_diag(sns.histplot) g.map_offdiag(sns.scatterplot) # 添加图例 g.add_legend() plt.suptitle("PairGrid Example: Iris Dataset Pairwise Relationships", y=1.02) # 添加总标题 plt.show()

代码详解 7.1.2:

  1. sns.load_dataset("iris"): 加载Seaborn内置的 iris 数据集,该数据集包含了鸢尾花的花萼和花瓣 measurements,以及鸢尾花的品种信息。

  2. sns.PairGrid(iris, hue="species"): 创建 PairGrid 对象。

    • data=iris: 指定使用的数据集为 iris

    • hue="species": 指定 hue 分类变量为 species,即不同鸢尾花品种的数据点将使用不同的颜色进行区分。

  3. g.map_diag(sns.histplot): 指定对角线子图的绘图函数为 sns.histplot,即在对角线子图中绘制每个变量的直方图。

  4. g.map_offdiag(sns.scatterplot): 指定非对角线子图的绘图函数为 sns.scatterplot,即在非对角线子图中绘制每对变量的散点图。

  5. g.add_legend(): 添加图例,用于区分不同 hue 分类变量的颜色。

  6. plt.suptitle(...): 添加总标题。

  7. plt.show(): 显示图形。

mermaid 图 7.1.2:PairGrid 结构

内容详解 7.1.2:PairGrid 的工作原理

PairGrid 旨在快速探索数据集中数值变量之间的两两关系。

  • 变量对 (Variable Pairs): PairGrid 会自动遍历数据集中的所有数值变量,并生成所有可能的变量对组合。

  • map_diag()map_offdiag() 方法: map_diag() 方法用于指定对角线子图的绘图函数,通常用于展示单个变量的分布情况,例如直方图或核密度估计图。map_offdiag() 方法用于指定非对角线子图的绘图函数,通常用于展示两个变量之间的关系,例如散点图或等高线图。

  • hue 参数: hue 参数可以用来指定一个分类变量,PairGrid 会根据该变量的值,使用不同的颜色来区分数据点,从而在探索变量对关系的同时,考虑分类变量的影响。

  • 自定义子图: 类似于 FacetGridPairGrid 也返回一个 PairGrid 对象,我们可以进一步自定义子图的外观。

7.2 联合分布可视化:JointGrid

JointGrid 用于绘制联合分布图,它将两个变量的散点图(或其他双变量图)与各自的边缘分布图(例如直方图或核密度估计图)结合在一起,提供更全面的变量关系视图。

代码实践 7.2:使用 JointGrid 分析电影评分数据

我们使用Seaborn自带的 mpg 数据集,分析汽车的燃油效率(mpg)与重量(weight)之间的关系,并同时展示它们的边缘分布。

import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 mpg = sns.load_dataset("mpg") # 创建 JointGrid 对象,并指定 kind="reg" 绘制回归线 g = sns.JointGrid(data=mpg, x="mpg", y="weight", kind="reg") # 在主图中绘制散点图和回归线,边缘图默认绘制直方图 g.plot(sns.regplot, sns.histplot) plt.suptitle("JointGrid Example: MPG vs Weight with Regression and Histograms", y=1.02) # 添加总标题 plt.show()

代码详解 7.2:

  1. sns.load_dataset("mpg"): 加载Seaborn内置的 mpg 数据集,该数据集包含了汽车的燃油效率、重量等信息。

  2. sns.JointGrid(data=mpg, x="mpg", y="weight", kind="reg"): 创建 JointGrid 对象。

    • data=mpg: 指定使用的数据集为 mpg

    • x="mpg", y="weight": 指定 x 轴和 y 轴变量。

    • kind="reg": 指定主图类型为 "reg",即绘制带有回归线的散点图。

  3. g.plot(sns.regplot, sns.histplot): 将绘图函数应用到主图和边缘图。

    • sns.regplot: 指定主图的绘图函数为 sns.regplot,绘制散点图并添加回归线。

    • sns.histplot: 指定边缘图的绘图函数为 sns.histplot,绘制直方图。JointGrid 会自动将 x 轴变量传递给 x 轴边缘图,将 y 轴变量传递给 y 轴边缘图。

  4. plt.suptitle(...): 添加总标题。

  5. plt.show(): 显示图形。

mermaid 图 7.2:JointGrid 结构

内容详解 7.2:JointGrid 的工作原理

JointGrid 的目的是将双变量关系与其边缘分布信息整合在一个图中。

  • 主图 (Main Plot): 主图位于网格的中心区域,用于展示两个变量之间的关系。我们可以通过 kind 参数指定主图的类型,例如 "scatter" (散点图), "kde" (核密度估计图), "hist" (二维直方图), "reg" (带有回归线的散点图) 等。

  • 边缘图 (Marginal Plots): 边缘图位于主图的上方和右侧,分别展示 x 轴变量和 y 轴变量的分布情况。默认情况下,边缘图会绘制直方图,但我们也可以通过 marginal_kws 参数自定义边缘图的类型和样式。

  • plot() 方法: plot() 方法用于指定主图和边缘图的绘图函数。第一个参数是主图的绘图函数,第二个和第三个参数分别是 x 轴和 y 轴边缘图的绘图函数(如果需要自定义边缘图类型)。

  • 自定义组件: JointGrid 提供了更灵活的自定义选项,例如可以使用 g.ax_joint 访问主图的坐标轴对象,使用 g.ax_marg_xg.ax_marg_y 访问 x 轴和 y 轴边缘图的坐标轴对象,从而进行更精细的调整。

7.3 高级分类数据可视化

Seaborn 在分类数据可视化方面也提供了强大的功能,除了基础的箱线图、条形图、小提琴图等,我们还可以通过更高级的参数和技巧,创建更具洞察力的分类数据图形。

7.3.1 定制分类图的顺序和调色板

在分类图中,分类变量的顺序和颜色调色板的选择至关重要,它们直接影响图形的可读性和信息传达效果。

代码实践 7.3.1:定制箱线图的顺序和调色板

我们继续使用 tips 数据集,绘制箱线图展示不同星期几(day)的总消费(total_bill)分布,并定制星期几的显示顺序和颜色调色板。

import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 tips = sns.load_dataset("tips") # 定义星期几的顺序 day_order = ["Thur", "Fri", "Sat", "Sun"] # 定义自定义调色板 day_palette = {"Thur": "skyblue", "Fri": "lightgreen", "Sat": "coral", "Sun": "gold"} # 绘制箱线图,并定制顺序和调色板 sns.boxplot(x="day", y="total_bill", data=tips, order=day_order, palette=day_palette) plt.title("Customized Boxplot: Total Bill by Day of Week", fontsize=14) plt.show()

代码详解 7.3.1:

  1. day_order = ["Thur", "Fri", "Sat", "Sun"]: 定义一个列表 day_order,指定星期几的显示顺序。默认情况下,Seaborn 会按照分类变量在数据集中出现的顺序或字母顺序进行排序。

  2. day_palette = {"Thur": "skyblue", "Fri": "lightgreen", "Sat": "coral", "Sun": "gold"}: 定义一个字典 day_palette,指定每个星期几对应的颜色。我们可以使用 Seaborn 内置的调色板,也可以自定义颜色。

  3. sns.boxplot(..., order=day_order, palette=day_palette): 在 sns.boxplot() 函数中,使用 order 参数指定分类变量的顺序为 day_order,使用 palette 参数指定调色板为 day_palette

7.3.2 使用 hue 参数进行更细粒度的分类

hue 参数不仅可以用于 FacetGridPairGrid,也可以用于各种分类图,将数据按照第三个分类变量进行分组,从而进行更细粒度的分析。

代码实践 7.3.2:使用 hue 参数绘制分组箱线图

我们继续使用 tips 数据集,绘制分组箱线图,展示不同星期几(day)和性别(sex)组合下的总消费(total_bill)分布。

import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 tips = sns.load_dataset("tips") # 绘制分组箱线图,使用 hue 参数按性别分组 sns.boxplot(x="day", y="total_bill", hue="sex", data=tips, palette="muted") plt.title("Grouped Boxplot: Total Bill by Day and Sex", fontsize=14) plt.legend(title="Sex") # 添加图例标题 plt.show()

代码详解 7.3.2:

  1. sns.boxplot(..., hue="sex", ...): 在 sns.boxplot() 函数中,使用 hue="sex" 参数,将数据按照 sex 变量进行分组。Seaborn 会自动为不同 sex 值的箱线图使用不同的颜色。

  2. palette="muted": 指定使用 "muted" 调色板,这是一个柔和的颜色调色板。

  3. plt.legend(title="Sex"): 添加图例标题,使图例更清晰易懂。

7.4 高级定制:样式、主题和颜色

Seaborn 提供了强大的定制功能,我们可以通过修改样式、主题和颜色,创建符合特定需求和审美的可视化图形。

7.4.1 Seaborn 样式和主题

Seaborn 提供了几种预定义的样式和主题,可以快速改变图形的整体外观。

  • 样式 (Styles): 样式控制图形的整体视觉风格,例如网格线、轴线、刻度线等。Seaborn 提供了五种内置样式:"darkgrid", "whitegrid", "dark", "white", "ticks"

  • 主题 (Themes): 主题控制图形的配色方案和字体等更高级的视觉元素。Seaborn 提供了几个预定义主题,例如 "deep", "muted", "pastel", "bright", "darkgrid", "whitegrid", "dark", "white", "ticks"

代码实践 7.4.1:应用不同的样式和主题

import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 iris = sns.load_dataset("iris") # 绘制散点图函数 def plot_scatter(): sns.scatterplot(x="sepal_length", y="sepal_width", hue="species", data=iris) plt.title("Scatterplot with Different Styles and Themes", fontsize=14) # 应用 "darkgrid" 样式和默认主题 sns.set_style("darkgrid") plt.figure() plot_scatter() # 应用 "whitegrid" 样式和 "pastel" 主题 sns.set_style("whitegrid") sns.set_theme(palette="pastel") plt.figure() plot_scatter() # 应用 "ticks" 样式和 "dark" 主题 sns.set_style("ticks") sns.set_theme(palette="dark") plt.figure() plot_scatter() plt.show()

代码详解 7.4.1:

  1. sns.set_style("style_name"): 使用 sns.set_style() 函数设置全局样式。

  2. sns.set_theme(palette="theme_name"): 使用 sns.set_theme() 函数设置全局主题,包括调色板。

  3. plt.figure(): 每次调用 plt.figure() 创建一个新的图形,以便在不同的图形上应用不同的样式和主题。

7.4.2 自定义调色板

Seaborn 提供了多种方式来创建和使用自定义调色板,以满足不同的可视化需求。

  • 内置调色板: Seaborn 提供了丰富的内置调色板,例如 color_palette(), husl_palette(), hls_palette(), cubehelix_palette(), dark_palette(), light_palette(), diverging_palette() 等。

  • 自定义颜色列表: 我们可以直接创建一个颜色列表,并将其传递给 palette 参数。

  • 颜色映射 (Colormaps): 对于数值型 hue 变量,可以使用 Matplotlib 的颜色映射 (Colormaps) 来创建连续的颜色渐变。

代码实践 7.4.2:使用不同的调色板

import seaborn as sns import matplotlib.pyplot as plt # 加载数据集 tips = sns.load_dataset("tips") # 绘制条形图函数 def plot_barplot(palette_name): sns.barplot(x="day", y="total_bill", data=tips, palette=palette_name) plt.title(f"Barplot with {palette_name} Palette", fontsize=14) # 使用 "viridis" 调色板 plt.figure() plot_barplot("viridis") # 使用 "rocket" 调色板 plt.figure() plot_barplot("rocket") # 使用自定义颜色列表调色板 custom_palette = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c"] plt.figure() plot_barplot(custom_palette) plt.show()

代码详解 7.4.2:

  1. plot_barplot(palette_name): 定义一个函数,接受调色板名称或颜色列表作为参数,并绘制条形图。

  2. plot_barplot("viridis"), plot_barplot("rocket"): 分别使用 Seaborn 内置的 "viridis" 和 "rocket" 调色板。

  3. custom_palette = [...]: 创建一个自定义颜色列表。

  4. plot_barplot(custom_palette): 使用自定义颜色列表作为调色板。

7.5 高级图形组合与布局

除了 FacetGrid, PairGrid, JointGrid 之外,Seaborn 还提供了其他高级方法来组合和布局图形,例如使用 Matplotlib 的 gridspec 或更高级的布局管理工具。

7.5.1 使用 Matplotlib GridSpec 自定义布局

我们可以利用 Matplotlib 的 GridSpec 对象,更精细地控制子图的布局,并将 Seaborn 图形嵌入到自定义布局中。

代码实践 7.5.1:使用 GridSpec 创建复杂布局

import seaborn as sns import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec # 加载数据集 iris = sns.load_dataset("iris") # 创建 GridSpec 对象,定义 2x2 网格 gs = gridspec.GridSpec(2, 2) fig = plt.figure(figsize=(10, 8)) # 子图 1: 散点图 ax1 = fig.add_subplot(gs[0, :]) # 占据第一行所有列 sns.scatterplot(x="sepal_length", y="sepal_width", hue="species", data=iris, ax=ax1) ax1.set_title("Sepal Length vs Sepal Width") # 子图 2: 直方图 (sepal_length) ax2 = fig.add_subplot(gs[1, 0]) # 占据第二行第一列 sns.histplot(iris["sepal_length"], ax=ax2) ax2.set_title("Distribution of Sepal Length") # 子图 3: 箱线图 (petal_width) ax3 = fig.add_subplot(gs[1, 1]) # 占据第二行第二列 sns.boxplot(x="species", y="petal_width", data=iris, ax=ax3) ax3.set_title("Boxplot of Petal Width by Species") plt.tight_layout() # 自动调整子图布局,避免重叠 plt.suptitle("Custom Layout with GridSpec", y=1.02, fontsize=16) plt.show()

代码详解 7.5.1:

  1. import matplotlib.gridspec as gridspec: 导入 gridspec 模块。

  2. gs = gridspec.GridSpec(2, 2): 创建 GridSpec 对象,定义一个 2x2 的网格布局。

  3. fig = plt.figure(figsize=(10, 8)): 创建一个 Matplotlib 图形对象。

  4. ax1 = fig.add_subplot(gs[0, :]): 使用 fig.add_subplot() 方法创建子图,并指定子图在 GridSpec 中的位置。gs[0, :] 表示占据第一行所有列。

  5. sns.scatterplot(..., ax=ax1): 在 Seaborn 绘图函数中,使用 ax 参数指定要将图形绘制在哪个 Matplotlib 坐标轴对象上,例如 ax=ax1 表示将散点图绘制在 ax1 坐标轴上。

  6. plt.tight_layout(): 自动调整子图布局,避免子图之间重叠。

7.6 总结与展望

本章我们深入探讨了Seaborn的高级应用,包括:

  • FacetGridPairGrid: 用于创建多变量数据可视化网格,从多个维度探索数据关系。

  • JointGrid: 用于绘制联合分布图,整合双变量关系和边缘分布信息。

  • 高级分类数据可视化: 定制分类图的顺序、调色板,以及使用 hue 参数进行更细粒度的分类。

  • 高级定制: Seaborn 样式、主题和自定义调色板的应用。

  • 高级图形组合与布局: 使用 Matplotlib GridSpec 自定义图形布局。

掌握这些高级技巧,能够帮助我们创建更复杂、更具洞察力的Seaborn可视化图形,从而更有效地探索和理解数据。Seaborn 的强大之处在于其灵活性和可扩展性,我们可以根据具体的数据分析需求,灵活运用各种功能和参数,创造出独具特色的数据可视化作品。


发布者: 作者: 转发
评论区 (0)
U