跳至主要内容

Seaborn 条形图(Barplot):完整指南

学习在 Python 中创建与自定义 Seaborn 条形图。从基础到高级功能,掌握可视化类别数据关系的关键技巧。
· 10分钟 阅读

使用 AI 探索

数据可视化能将复杂信息转化为清晰且可行动的洞见。Seaborn 条形图擅长以优雅、具统计意义的图形呈现类别数据。该库融合了 Matplotlib 的灵活性与 pandas 的强大功能,非常适合快速分析与可发表级别的可视化。

Seaborn 条形图为数据分析提供了必备功能——从基础对比到高级统计表达。它能胜任常见任务,如比较各地区的销售指标、分析问卷反馈、可视化实验结果等。

该库直观的语法与内置统计函数,使其对初学者与经验丰富的数据从业者都颇具价值。

本文将介绍 Seaborn 条形图基础、通过代码示例创建基本图形、通过自定义增强可视化、实现高级功能,并探讨实际应用。

想进一步学习使用 Seaborn 进行数据可视化,请查看我们的Seaborn 数据可视化入门课程。

Seaborn 条形图基础

在进入条形图之前,先了解 Seaborn 的一些基本概念、其在条形图中的优势,以及如何搭建编码环境。

什么是 Seaborn?

Seaborn 是一个基于 Matplotlib 构建的 Python 统计数据可视化库。它专注于用最少的代码创建信息丰富且美观的统计图形。该库与 pandas 的 DataFrame 紧密集成,特别适用于数据分析工作流。

它提供了高级接口来绘制美观图形,并能自动处理许多样式细节。

该库在三个方面表现突出:

  • 与 pandas DataFrame 无缝集成,使数据处理更为直接
  • 内置统计函数,无需单独进行计算
  • 默认应用专业外观的主题与配色方案

例如,在 Matplotlib 中创建一个基础统计可视化可能需要多行代码,而 Seaborn 只需一次函数调用即可完成相同任务。

就条形图而言,Seaborn 提供了强大的功能,如自动均值计算、置信区间以及高级类别变量处理——这些能力在原生 Matplotlib 中需要大量额外代码。

为何使用条形图?

条形图通过垂直或水平的条形呈现类别数据,条形长度代表数值大小。这使其非常适合比较不同组或类别之间的数值。在数据分析中,条形图有助于可视化问卷结果、市场份额、绩效指标以及销售分布。

主要优势包括:

  • 清晰比较各类别的数量
  • 内置统计特性(均值、中位数、置信区间)
  • 有效呈现分组数据
  • 简单却信息量丰富的视觉元素
  • 便于自定义,适合专业展示

快速设置

要开始用 Seaborn 创建条形图,我们需要先搭建 Python 环境。操作如下:

首先,按下述方式安装所需包:

pip install seaborn pandas numpy

现在我们已准备好所有可视化工具。接下来按如下方式导入需要的库:

# For creating statistical visualizations
import seaborn as sns

# For data manipulation and analysis
import pandas as pd

# For numerical operations
import numpy as np

我们可以通过一些样式设置让图表更美观,如下所示:

# Clean white style
sns.set_style("white")

white 样式会移除网格线,并让图表在大多数屏幕上都有良好观感。接下来我们将开始创建并增强条形图。

创建基础的 Seaborn 条形图

条形图非常适合可视化类别与数值变量之间的关系。它显示点估计(如均值或中位数)以及通过误差线表示估计的不确定性。下面看一下 seaborn 条形图的基本语法。

语法与参数

Seaborn 中的 sns.barplot() 提供了一种直接的方法来创建统计条形图。其基本结构如下所示:

sns.barplot(
    data=None,      # Your DataFrame
    x=None,         # Category variable
    y=None,         # Numeric variable
    estimator='mean',  # Statistical function to estimate
    errorbar=('ci', 95),  # Error bars type and level
    orient=None     # "v" for vertical, "h" for horizontal
)

这些参数让我们能够控制展示哪些数据以及如何展示。data 参数接收您的 DataFrame,而 x 与 y 指定用于类别与数值的列。estimator 可选择应用的统计函数(默认均值),而 errorbar 控制不确定性的展示方式。您还可以通过 orient 参数在垂直与水平方向之间切换。

现在,让我们使用 Seaborn 内置的 tips 数据集来创建有效的条形图。该数据集包含餐厅账单与小费的信息。

示例:可视化一个简单数据集

我们将使用 tips 数据集查看不同星期几的小费行为。该数据集包含餐厅账单信息,包括星期几、总账单金额、小费金额及其他变量。

# Import required libraries and load dataset
import seaborn as sns
tips = sns.load_dataset("tips")

# Create a basic barplot showing average tips by day
sns.barplot(data=tips, x="day", y="tip")

输出:

我们的代码生成了上述可视化,每个条形代表一周中不同天的小费平均金额。条形高度表示均值,而黑色线段(误差线)显示 95% 置信区间——帮助我们了解典型小费水平及其波动程度。

我们也可以考察不同用餐时段的小费模式:

# Create a barplot showing average tips by time of day
sns.barplot(data=tips, x="time", y="tip")

输出:

该图揭示了午餐与晚餐时段小费行为的差异。每个条形的高度代表该时段的小费平均值,误差线展示小费行为的变动性。这类可视化便于一眼识别模式并比较各组。

这些基础条形图为更复杂的可视化打下了基础。下一节我们将通过颜色、分组及其他自定义来增强图表,使其更具信息量与视觉吸引力。

通过自定义增强条形图

为条形图添加视觉增强能让数据更具吸引力且更易理解。下面以 tips 数据集演示不同的自定义方式。

为条形图添加颜色

Seaborn 提供多种方式为条形图添加颜色,使其更美观也更具信息性。我们可以为所有条形使用单一颜色,或创建按组配色的图表,

color 参数为所有条形设置单一颜色,而 palette 允许在数据存在多组时指定配色方案。Seaborn 自带多种适用于不同数据类型的配色方案。

我们可以使用 color 参数创建单色条形图,如下:

# Load the tips dataset if you haven't already
import seaborn as sns
tips = sns.load_dataset("tips")

# Single color barplot
sns.barplot(data=tips, x="day", y="tip", color="skyblue")

输出:

我们也可以使用 palette 参数创建多色条形图,如下:

# Load the tips dataset if you haven't already
import seaborn as sns
tips = sns.load_dataset("tips")

# Using a different color palette
sns.barplot(data=tips, x="day", y="tip", palette="Set2")

输出:

包含多列的 Seaborn 条形图

Seaborn 条形图最强大的特性之一是可通过 hue 参数展示多个变量之间的关系,从而创建分组条形,便于比较。

让我们同时比较不同天与不同用餐时段的小费,使用 hue 参数如下所示:

# Load the tips dataset if you haven't already
import seaborn as sns
tips = sns.load_dataset("tips")

# Create a grouped barplot showing tips by day and time
sns.barplot(
    data=tips,
    x="day",
    y="tip",
    hue="time"
)

输出:

上述图中每一天都有两个条形——分别代表午餐与晚餐。这样的分组不仅让我们看到按天的小费差异,也能比较不同用餐时段之间的差别。

创建 Seaborn 堆叠条形图

堆叠条形图非常适合展示不同类别的构成。尽管 Seaborn 没有直接的堆叠条形图函数,但我们可以与 matplotlib 结合来创建有效的堆叠可视化。

这种方法既能利用 Seaborn 的统计功能,又能使用 matplotlib 的堆叠能力。以 tips 数据集为例,来看不同天里吸烟者与非吸烟者的小费分布。

首先导入可视化所需的库:

# Import required libraries
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

接着加载包含餐厅小费信息的数据集:

# Load the tips dataset
tips = sns.load_dataset("tips")

创建具有合适尺寸的图形:

# Create figure and axis
plt.figure(figsize=(10, 4))

然后计算不同天里吸烟者与非吸烟者的小费平均值:

# Calculate values for stacking
# Filter smokers, group by day and get mean tips
smoker_means = tips[tips['smoker']=='Yes'].groupby('day')['tip'].mean()
 
# Filter non-smokers, group by day and get mean tips     
non_smoker_means = tips[tips['smoker']=='No'].groupby('day')['tip'].mean()

随后设置堆叠条形的基础参数如下:

# Plot the stacked bars using matplotlib
days = smoker_means.index
width = 0.8

现在为非吸烟者创建堆叠条形的底部层:

# Create bottom bars (non-smokers)
plt.bar(days, non_smoker_means, width, label='Non-smoker', color=sns.color_palette()[0])

为吸烟者的小费添加顶部层:

# Create top bars (smokers)
plt.bar(days, smoker_means, width, bottom=non_smoker_means, 
        label='Smoker', color=sns.color_palette()[1])

使用 seaborn 样式设置为无网格的简洁风格:

# Add Seaborn styling
sns.set_style("white")

最后展示完成的堆叠条形图:

# Show the plot
plt.show()

输出:

结果图显示每一天中,吸烟者的小费平均值堆叠在非吸烟者之上,便于同时比较总小费与各组的贡献。

这种变通方法可以:

  • 保留 Seaborn 的美观视觉风格
  • 通过堆叠展示构成
  • 保持可视化的统计属性
  • 使用 Seaborn 的配色方案以保持一致性

高级功能与技巧

在掌握基础与自定义后,我们再来看一些高级功能,帮助条形图更具信息性与专业度。我们继续使用 tips 数据集演示这些高级技巧。

为条形图添加标注

为条形添加数值标签能使可视化更精确、更具信息量。让我们创建一个在每个条形上方显示精确小费数值的图表。

首先导入库并准备数据:

# Import required libraries
import seaborn as sns
import matplotlib.pyplot as plt

# Load and prepare the tips dataset
tips = sns.load_dataset("tips")

创建带统计值的条形图:

# Create the basic barplot
ax = sns.barplot(data=tips, x="day", y="tip”, errorbar=None)    # Create barplot and store the axes object for annotations

接着在每个条形顶部添加数值标签,如下:

# Get the height of each bar
bars = ax.containers[0]                           # Get the bar container object
heights = [bar.get_height() for bar in bars]      # Extract height of each bar

# Add text annotations on top of each bar
for bar, height in zip(bars, heights):            # Loop through bars and heights together
    ax.text(
        bar.get_x() + bar.get_width()/2.,        # X position (center of bar)
        height,                                   # Y position (top of bar)
        f'${height:.2f}',                        # Text (format as currency)
        ha='center',                             # Horizontal alignment
        va='bottom'                              # Vertical alignment
    )

输出:

管理坐标轴与刻度

创建条形图时,调整坐标轴有助于提升可读性与表达效果。下面演示如何使用 Seaborn 的函数自定义坐标轴范围、标签与刻度。

首先导入库并加载可视化所需的数据集:

# Import required libraries
import seaborn as sns

# Load and prepare the tips dataset
tips = sns.load_dataset("tips")

我们可以创建带自定义标签与星期顺序的条形图。order 参数允许我们精确指定 x 轴上各天的排列顺序:

# Create barplot with axis labels
ax = sns.barplot(
    data=tips,
    x="day",
    y="tip",
    order=['Thur', 'Sat', ‘Fri', 'Sun']     # Set custom order for days
)

为使图表更具信息性,可用 set 方法为两个坐标轴添加描述性标签:

# Set descriptive axis labels
ax.set(
    xlabel='Day of Week',
    ylabel='Average Tip ($)'
)

为进一步微调可视化,我们可以设定特定的范围与刻度。ylim 控制 y 轴范围,而 xticks 与 yticks 则可精确指定刻度位置:

# Customize axis limits and ticks
ax.set(
    ylim=(0, 5),                            # Set y-axis range from 0 to 5
    xticks=range(4),                        # Set x-axis tick positions
    yticks=[0, 1, 2, 3, 4, 5]              # Set specific y-axis tick values
)

要在图中体现上述所有更改,我们需要一次性运行整段代码,而非逐个执行。完整代码如下:

# Import required libraries
import seaborn as sns

# Load and prepare the tips dataset
tips = sns.load_dataset("tips")

# Create barplot with axis labels
ax = sns.barplot(
   data=tips,
   x="day",
   y="tip",
   order=['Thur', 'Sat', 'Fri', 'Sun']     # Set custom order for days
)

# Set descriptive axis labels
ax.set(
   xlabel='Day of Week',
   ylabel='Average Tip ($)'
)

# Customize axis limits and ticks
ax.set(
   ylim=(0, 5),                            # Set y-axis range from 0 to 5
   xticks=range(4),                        # Set x-axis tick positions
   yticks=[0, 1, 2, 3, 4, 5]              # Set specific y-axis tick values
)

输出:

结果图清晰显示按天的小费,标签明确、刻度与范围得当,便于阅读与解读。

加入误差线

误差线有助于可视化数据中的不确定性或变动性。Seaborn 提供多种向条形图添加误差线的选项,包括置信区间与标准差。

首先导入库并加载可视化所需的数据集:

# Import required libraries
import seaborn as sns

# Load and prepare the tips dataset
tips = sns.load_dataset("tips")

默认情况下,Seaborn 显示 95% 置信区间。我们可以通过 'errorbar' 参数修改为不同类型的统计估计:

# Create barplot with confidence intervals
ax = sns.barplot(
    data=tips,
    x="day",
    y="tip",
    errorbar="ci",                          # Show confidence interval
    capsize=0.1                            # Add small caps to error bars
)

输出:

我们也可以显示标准差而非置信区间,以帮助可视化数据的离散程度:

# Switch to standard deviation
ax = sns.barplot(
    data=tips,
    x="day",
    y="tip",
    errorbar="sd",                          # Show standard deviation
    capsize=0.1                            # Add small caps to error bars
)

输出:

有时为了更简洁的外观,我们也可以完全移除误差线:

# Create barplot without error bars
ax = sns.barplot(
    data=tips,
    x="day",
    y="tip",
    errorbar=None                           # Remove error bars
)

输出:

这些图展示了不同误差线类型如何帮助我们理解各星期天小费数据的变动性。

Seaborn 条形图的实际应用

条形图是数据可视化中用途广泛的工具,尤其适用于比较不同类别的数值或同时分析多个变量。下面看看 Seaborn 条形图擅长的两个常见应用场景。

可视化类别数据趋势

Seaborn 条形图在揭示类别数据中的模式方面表现出色,特别是在分析不同群组的指标时。通过同时展示集中趋势与不确定性,条形图有助于识别类别间的显著差异。

因此,它非常适合分析客户行为、产品表现或问卷反馈等需要跨不同群组比较数值的场景。

比较多个变量

当分析涉及多个因素时,Seaborn 的条形图能够突出数据中的复杂关系。使用分组(hue)或堆叠等特性,可以同时比较不同变量,更易发现数据各方面之间的模式与相互作用。

结语

Seaborn 条形图在简洁性与统计洞见之间取得了恰当平衡。该库直观的语法与强大的统计功能,使其成为数据可视化的必备工具。从基础的类别对比到高级的分组可视化,条形图都能有效揭示并传达数据模式。

准备提升您的数据可视化技能?不妨继续探索:

想更进一步提升您的 Seaborn 技能?请报名 Seaborn 数据可视化进阶课程。

Seaborn 条形图常见问题

Seaborn 条形图用于什么?

Seaborn 条形图通过带误差线的统计估计,来可视化类别变量与数值变量之间的关系。

我可以更改 Seaborn 条形图的颜色吗?

可以。您可以使用 color 参数设置单一颜色,或使用 palette 参数选择多色配色方案。

我可以在 Seaborn 中创建分组条形图吗?

可以,使用 hue 参数即可基于某个类别变量创建分组条形。

如何为 Seaborn 条形图添加误差线?

使用 errorbar 参数,例如 errorbar='ci' 表示置信区间,或 errorbar='sd' 表示标准差。

Seaborn 能创建水平条形图吗?

可以,在函数中设置 orient='h' 即可创建水平条形图。

作者

Rajesh Kumar

我是一名数据科学内容写作者,热衷于创作与 AI/ML/DS 相关的内容。我也会探索新的 AI 工具并撰写相关文章。

主题