3.2 结合 Pandas 进行数据可视化


文档摘要

3.2 结合 Pandas 进行数据可视化 3.2 结合 Pandas 进行数据可视化:释放数据洞察力的强大组合 数据可视化是数据分析流程中至关重要的一环。它将抽象的数据转化为易于理解的图形,帮助我们发现数据中的模式、趋势和异常,从而做出更明智的决策。Matplotlib 作为 Python 中最流行的绘图库之一,提供了强大的可视化功能。而 Pandas 则是在数据处理和分析领域占据核心地位的库,它提供了高效的数据结构(DataFrame 和 Series)和数据操作工具。当 Matplotlib 与 Pandas 结合使用时,数据可视化变得更加高效和便捷,能够极大地提升数据分析的效率和深度。 本节将深入探讨如何将 Matplotlib 与 Pandas 结合,进行有效的数据可视化。

3.2 结合 Pandas 进行数据可视化

3.2 结合 Pandas 进行数据可视化:释放数据洞察力的强大组合

数据可视化是数据分析流程中至关重要的一环。它将抽象的数据转化为易于理解的图形,帮助我们发现数据中的模式、趋势和异常,从而做出更明智的决策。Matplotlib 作为 Python 中最流行的绘图库之一,提供了强大的可视化功能。而 Pandas 则是在数据处理和分析领域占据核心地位的库,它提供了高效的数据结构(DataFrame 和 Series)和数据操作工具。当 Matplotlib 与 Pandas 结合使用时,数据可视化变得更加高效和便捷,能够极大地提升数据分析的效率和深度。

本节将深入探讨如何将 Matplotlib 与 Pandas 结合,进行有效的数据可视化。我们将从 Pandas 数据结构与 Matplotlib 的兼容性入手,逐步讲解如何使用 Pandas 的数据直接生成各种类型的图表,并深入探讨定制化图表以满足更复杂的可视化需求。通过代码实践和详细的解释,你将掌握利用这两个库的强大功能,轻松地从数据中提取有价值的洞察力。

3.2.1 Pandas 数据结构与 Matplotlib 的无缝衔接

Pandas 的 DataFrame 和 Series 是组织和处理结构化数据的理想选择。而 Matplotlib 的绘图函数可以直接接受 Pandas 的数据结构作为输入,这使得数据可视化流程变得异常流畅。

Pandas DataFrame 和 Series 的优势:

  • 结构化数据存储: DataFrame 以表格形式存储数据,包含行和列,并允许为每一列指定数据类型。Series 则是一维带标签的数据结构,类似于带索引的数组。

  • 强大的数据操作: Pandas 提供了丰富的数据操作功能,如数据清洗、过滤、转换、聚合等,可以方便地对数据进行预处理,为可视化准备干净、整洁的数据。

  • 标签索引: Pandas 的数据结构具有标签索引,这使得数据访问和选择更加直观和高效。在可视化中,索引标签可以自然地映射到图表的轴标签,增强图表的可读性。

Matplotlib 对 Pandas 数据结构的支持:

Matplotlib 的 plot() 函数以及其他绘图函数(如 scatter(), bar(), hist(), boxplot() 等)可以直接接受 Pandas DataFrame 或 Series 对象作为输入。这意味着,你无需将 Pandas 数据转换为 NumPy 数组或其他格式,就可以直接使用它们来生成图表。

工作流程图 (Mermaid Graph TD):

代码实践 3.2.1:使用 Pandas Series 和 DataFrame 绘制基本图表

首先,我们需要导入必要的库:

import pandas as pd import matplotlib.pyplot as plt

1. 使用 Pandas Series 绘制折线图:

# 创建一个 Pandas Series data_series = pd.Series([10, 15, 22, 18, 25], index=['A', 'B', 'C', 'D', 'E']) # 使用 Series 的 plot() 方法绘制折线图 data_series.plot() # 添加标题和轴标签 plt.title('Pandas Series 折线图示例') plt.xlabel('索引') plt.ylabel('数值') # 显示图表 plt.show()

代码详解:

  • pd.Series([10, 15, 22, 18, 25], index=['A', 'B', 'C', 'D', 'E']):创建了一个 Pandas Series,数据为 [10, 15, 22, 18, 25],索引为 ['A', 'B', 'C', 'D', 'E']

  • data_series.plot():直接调用 Series 对象的 plot() 方法,Matplotlib 会自动识别 Series 的数据和索引,并生成折线图。Series 的索引将作为 x 轴,数值将作为 y 轴。

  • plt.title(), plt.xlabel(), plt.ylabel():使用 Matplotlib 的函数添加图表标题和轴标签,增强图表的可读性。

  • plt.show():显示生成的图表。

2. 使用 Pandas DataFrame 绘制柱状图:

# 创建一个 Pandas DataFrame data_dict = {'类别': ['类别1', '类别2', '类别3', '类别4'], '数量': [30, 45, 25, 35]} data_df = pd.DataFrame(data_dict) # 使用 DataFrame 的 plot() 方法绘制柱状图 data_df.plot(x='类别', y='数量', kind='bar') # 添加标题和轴标签 plt.title('Pandas DataFrame 柱状图示例') plt.xlabel('类别') plt.ylabel('数量') # 显示图表 plt.show()

代码详解:

  • data_dict = {'类别': ['类别1', '类别2', '类别3', '类别4'], '数量': [30, 45, 25, 35]}:创建了一个字典,用于构建 DataFrame。

  • pd.DataFrame(data_dict):使用字典创建 Pandas DataFrame。

  • data_df.plot(x='类别', y='数量', kind='bar'):调用 DataFrame 的 plot() 方法,并指定:

    • x='类别':指定 '类别' 列作为 x 轴数据。

    • y='数量':指定 '数量' 列作为 y 轴数据。

    • kind='bar':指定图表类型为柱状图。

  • 其余代码与 Series 示例类似,用于添加标题、轴标签和显示图表。

通过以上代码示例,我们可以看到 Pandas 数据结构与 Matplotlib 的结合非常简单直接。Pandas 提供了 plot() 方法,可以直接基于 DataFrame 和 Series 生成各种类型的图表,极大地简化了可视化代码的编写。

3.2.2 Pandas plot() 方法详解:快速生成常用图表

Pandas DataFrame 和 Series 对象都内置了 plot() 方法,这是一个非常方便的接口,可以快速生成各种常用的图表类型。plot() 方法实际上是对 Matplotlib 的 pyplot 模块的封装,它根据传入的参数自动调用相应的 Matplotlib 函数进行绘图。

plot() 方法的主要参数:

  • kind: 指定图表类型,常用的类型包括:

    • 'line' (默认): 折线图

    • 'bar' / 'barh': 柱状图 / 水平柱状图

    • 'hist': 直方图

    • 'box': 箱线图

    • 'kde' / 'density': 核密度估计图

    • 'scatter': 散点图

    • 'pie': 饼图

  • x: 指定 x 轴数据,通常为 DataFrame 的列名或 Series 的索引。

  • y: 指定 y 轴数据,通常为 DataFrame 的列名或 Series 的数值。

  • figsize: 图表尺寸,以英寸为单位,例如 (8, 6)

  • title: 图表标题。

  • xlabel: x 轴标签。

  • ylabel: y 轴标签。

  • color: 线条或柱状图的颜色。

  • label: 图例标签。

  • legend: 是否显示图例,TrueFalse

  • grid: 是否显示网格线,TrueFalse

  • xticks, yticks: 自定义 x 轴和 y 轴刻度。

  • xlim, ylim: 设置 x 轴和 y 轴的范围。

  • style: 线条样式,例如 '-', '--', ':', '.',以及颜色和标记的组合,例如 'r--o' (红色虚线圆圈标记)。

代码实践 3.2.2:使用 plot() 方法生成不同类型的图表

我们将继续使用之前创建的 data_seriesdata_df 数据,演示如何使用 plot() 方法生成不同类型的图表。

1. 折线图 (Line Plot) - 默认类型:

data_series.plot(title='折线图') plt.show()

2. 柱状图 (Bar Plot):

data_df.plot(x='类别', y='数量', kind='bar', title='柱状图', color='skyblue') plt.show()

3. 水平柱状图 (Barh Plot):

data_df.plot(x='类别', y='数量', kind='barh', title='水平柱状图', color='lightgreen') plt.show()

4. 直方图 (Histogram):

为了演示直方图,我们创建一个新的 Series 数据,模拟一组数值数据分布:

import numpy as np # 生成 100 个随机数,服从正态分布 random_data = pd.Series(np.random.randn(1000)) random_data.plot(kind='hist', title='直方图', bins=20, edgecolor='black') # bins 参数控制柱子数量,edgecolor 设置柱子边框颜色 plt.show()

5. 箱线图 (Box Plot):

箱线图常用于展示数据的分布和异常值。我们使用 DataFrame 展示多个类别的箱线图:

box_data = pd.DataFrame({'类别1': np.random.randn(100), '类别2': np.random.randn(120) + 1, # 类别2 的数据整体偏移 '类别3': np.random.randn(80) - 1}) # 类别3 的数据整体偏移 box_data.plot(kind='box', title='箱线图', vert=True) # vert=True 垂直箱线图,vert=False 水平箱线图 plt.ylabel('数值') plt.show()

6. 散点图 (Scatter Plot):

散点图用于展示两个变量之间的关系。我们需要 DataFrame 至少包含两列数值数据。

scatter_df = pd.DataFrame({'X轴': np.random.rand(50), 'Y轴': np.random.rand(50)}) scatter_df.plot(x='X轴', y='Y轴', kind='scatter', title='散点图', color='purple', marker='o') # marker 参数设置标记形状 plt.show()

7. 饼图 (Pie Chart):

饼图用于展示各部分占总体的比例。通常用于 Series 数据,或者 DataFrame 的单列数据。

pie_series = pd.Series([20, 30, 50], index=['A', 'B', 'C'], name='占比数据') pie_series.plot(kind='pie', title='饼图', autopct='%1.1f%%', startangle=90) # autopct 显示百分比,startangle 起始角度 plt.ylabel('') # 饼图通常不需要 y 轴标签 plt.show()

通过以上代码实践,我们演示了如何使用 Pandas plot() 方法快速生成多种常用图表类型。只需要简单地指定 kind 参数,就可以轻松切换图表类型,并可以通过其他参数进行基本的定制化。

3.2.3 使用 Matplotlib API 进行更精细的图表定制

虽然 Pandas plot() 方法非常方便快捷,但在需要进行更精细的图表定制时,直接使用 Matplotlib 的 API 会提供更大的灵活性和控制力。 我们可以直接访问 Matplotlib 的 pyplot 模块,并使用其提供的各种函数和对象,来更深入地定制图表的各个方面。

核心概念:Figure 和 Axes

在使用 Matplotlib API 进行绘图时,需要理解两个核心概念:

  • Figure (画布): 整个图表所在的顶层容器。可以包含多个 Axes。

  • Axes (坐标轴): 实际绘制图表的区域,包含 x 轴、y 轴、数据区域等。一个 Figure 可以包含多个 Axes,例如子图。

创建 Figure 和 Axes 对象:

可以使用 plt.subplots() 函数创建 Figure 和 Axes 对象。

fig, ax = plt.subplots(figsize=(8, 6)) # figsize 设置画布大小
  • fig: Figure 对象。

  • ax: Axes 对象。

使用 Axes 对象进行绘图:

创建 Axes 对象后,可以使用 Axes 对象的方法进行绘图,例如:

  • ax.plot(): 绘制折线图

  • ax.scatter(): 绘制散点图

  • ax.bar(): 绘制柱状图

  • ax.hist(): 绘制直方图

  • ax.boxplot(): 绘制箱线图

  • ax.pie(): 绘制饼图

  • ax.set_title(): 设置标题

  • ax.set_xlabel(): 设置 x 轴标签

  • ax.set_ylabel(): 设置 y 轴标签

  • ax.legend(): 显示图例

  • ax.grid(): 显示网格线

  • ax.set_xticks() / ax.set_yticks(): 设置轴刻度

  • ax.set_xlim() / ax.set_ylim(): 设置轴范围

代码实践 3.2.3:使用 Matplotlib API 定制图表

我们使用之前的 data_df 数据,演示如何使用 Matplotlib API 进行更精细的图表定制。

1. 定制柱状图:

fig, ax = plt.subplots(figsize=(8, 6)) # 使用 ax.bar() 绘制柱状图 ax.bar(data_df['类别'], data_df['数量'], color=['skyblue', 'lightcoral', 'lightgreen', 'gold']) # 可以为每个柱子设置不同颜色 # 定制标题和轴标签 ax.set_title('定制化柱状图', fontsize=16) # 设置标题字体大小 ax.set_xlabel('商品类别', fontsize=12) ax.set_ylabel('销售数量', fontsize=12) # 添加数值标签到柱子上 for i, v in enumerate(data_df['数量']): ax.text(i, v + 1, str(v), ha='center', va='bottom') # ha 水平对齐,va 垂直对齐 # 添加网格线 ax.grid(axis='y', linestyle='--') # 只显示 y 轴网格线,虚线样式 # 调整 x 轴刻度标签 ax.set_xticks(range(len(data_df['类别']))) # 设置刻度位置 ax.set_xticklabels(data_df['类别'], rotation=45, ha='right') # 设置刻度标签,旋转 45 度,右对齐 # 移除顶部和右侧边框 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) plt.tight_layout() # 自动调整子图参数,防止标签重叠 plt.show()

代码详解:

  • fig, ax = plt.subplots(figsize=(8, 6)): 创建 Figure 和 Axes 对象。

  • ax.bar(data_df['类别'], data_df['数量'], color=['skyblue', 'lightcoral', 'lightgreen', 'gold']): 使用 ax.bar() 绘制柱状图,并为每个柱子指定不同的颜色。

  • ax.set_title(), ax.set_xlabel(), ax.set_ylabel(): 使用 Axes 对象的方法设置标题和轴标签,并可以设置字体大小等属性。

  • 添加数值标签: 使用 ax.text() 在每个柱子的顶部添加数值标签,ha='center' 水平居中对齐,va='bottom' 垂直底部对齐。

  • ax.grid(axis='y', linestyle='--'): 添加 y 轴网格线,并设置为虚线样式。

  • ax.set_xticks(), ax.set_xticklabels(): 自定义 x 轴刻度位置和标签,rotation=45 将标签旋转 45 度,ha='right' 右对齐,防止标签重叠。

  • ax.spines['top'].set_visible(False), ax.spines['right'].set_visible(False): 移除顶部和右侧边框,使图表更简洁。

  • plt.tight_layout(): 自动调整子图参数,防止标签重叠,尤其是在有旋转标签时非常有用。

2. 定制散点图:

fig, ax = plt.subplots(figsize=(7, 7)) # 使用 ax.scatter() 绘制散点图 ax.scatter(scatter_df['X轴'], scatter_df['Y轴'], s=100, c=scatter_df['X轴'], cmap='viridis', alpha=0.7, edgecolors='black', linewidths=0.5) # s: 点的大小,c: 点的颜色,cmap: 颜色映射,alpha: 透明度,edgecolors: 边缘颜色,linewidths: 边缘线宽 # 定制颜色条 (colorbar) cbar = fig.colorbar(ax.collections[0], ax=ax) # 获取散点图的 Collection 对象,并添加到 colorbar cbar.set_label('X轴数值') # 设置颜色条标签 # 设置标题和轴标签 ax.set_title('定制化散点图', fontsize=16) ax.set_xlabel('X轴', fontsize=12) ax.set_ylabel('Y轴', fontsize=12) # 设置轴的比例相等,使散点图更准确 ax.set_aspect('equal') plt.show()

代码详解:

  • ax.scatter(...): 使用 ax.scatter() 绘制散点图,并使用更丰富的参数进行定制:

    • s=100: 设置点的大小为 100。

    • c=scatter_df['X轴']: 根据 'X轴' 列的数值设置点的颜色。

    • cmap='viridis': 使用 'viridis' 颜色映射,Matplotlib 提供了多种颜色映射方案。

    • alpha=0.7: 设置点的透明度为 0.7。

    • edgecolors='black', linewidths=0.5: 设置点的边缘颜色和线宽。

  • 颜色条 (colorbar):

    • fig.colorbar(ax.collections[0], ax=ax): 添加颜色条,ax.collections[0] 获取散点图的 Collection 对象(scatter() 返回的对象),并将其与颜色条关联。

    • cbar.set_label('X轴数值'): 设置颜色条的标签。

  • ax.set_aspect('equal'): 设置 x 轴和 y 轴的比例相等,这对于散点图来说通常更准确,尤其当需要展示变量之间的真实比例关系时。

通过以上定制化示例,我们看到使用 Matplotlib API 可以对图表的各个方面进行精细控制,包括颜色、样式、标签、刻度、网格线、边框等等。这为创建专业、美观且信息丰富的可视化图表提供了强大的工具。

3.2.4 结合 Pandas 数据操作进行高级可视化

Pandas 不仅提供数据存储结构,还提供了强大的数据操作功能。我们可以利用 Pandas 的数据操作能力,对数据进行清洗、转换、聚合等处理,然后再将处理后的数据用于 Matplotlib 可视化,从而实现更高级的数据分析和可视化流程。

常用的 Pandas 数据操作与可视化结合的技巧:

  • 数据过滤和选择: 使用 Pandas 的条件索引、lociloc 等方法,选择特定的数据子集进行可视化,例如,只展示某个类别的数据,或者筛选出满足特定条件的数据点。

  • 数据分组和聚合: 使用 Pandas 的 groupby() 方法对数据进行分组,并进行聚合计算(如求和、平均值、计数等),然后将聚合结果用于可视化,例如,展示不同类别的平均销售额。

  • 数据透视表: 使用 Pandas 的 pivot_table() 方法创建数据透视表,将数据重塑为更适合可视化的形式,例如,将长格式数据转换为宽格式数据。

  • 时间序列数据处理: Pandas 提供了强大的时间序列数据处理功能,可以方便地对时间序列数据进行重采样、移动平均、季节性分解等操作,并将处理后的时间序列数据用于可视化,例如,展示时间序列数据的趋势和季节性。

代码实践 3.2.4:结合 Pandas 数据操作进行高级可视化

我们使用一个示例数据集,演示如何结合 Pandas 数据操作和 Matplotlib 可视化。假设我们有一个销售数据集,包含日期、商品类别、地区和销售额等信息。

# 创建示例销售数据 DataFrame sales_data = pd.DataFrame({ '日期': pd.to_datetime(['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-03', '2023-01-03', '2023-01-04', '2023-01-04']), '商品类别': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'], '地区': ['东区', '西区', '东区', '西区', '西区', '东区', '东区', '西区'], '销售额': [150, 200, 180, 220, 250, 190, 210, 230] }) # 1. 按商品类别分组,计算总销售额,并绘制柱状图 category_sales = sales_data.groupby('商品类别')['销售额'].sum() fig, ax = plt.subplots() category_sales.plot(kind='bar', ax=ax, color=['skyblue', 'lightcoral']) ax.set_title('不同商品类别的总销售额') ax.set_xlabel('商品类别') ax.set_ylabel('总销售额') plt.show() # 2. 按日期和商品类别分组,计算总销售额,并绘制堆叠柱状图 daily_category_sales = sales_data.groupby(['日期', '商品类别'])['销售额'].sum().unstack() # unstack 将 '商品类别' 变为列 daily_category_sales.plot(kind='bar', stacked=True, figsize=(10, 6)) # stacked=True 堆叠柱状图 plt.title('每日不同商品类别的销售额') plt.xlabel('日期') plt.ylabel('销售额') plt.legend(title='商品类别') # 添加图例 plt.show() # 3. 按地区分组,计算总销售额,并绘制饼图 region_sales = sales_data.groupby('地区')['销售额'].sum() region_sales.plot(kind='pie', autopct='%1.1f%%', figsize=(6, 6)) plt.title('不同地区的销售额占比') plt.ylabel('') # 饼图通常不需要 y 轴标签 plt.show() # 4. 绘制每日总销售额的折线图 daily_total_sales = sales_data.groupby('日期')['销售额'].sum() daily_total_sales.plot(kind='line', marker='o', linestyle='-', figsize=(8, 5)) plt.title('每日总销售额趋势') plt.xlabel('日期') plt.ylabel('总销售额') plt.grid(True) # 添加网格线 plt.show()

代码详解:

  • 示例数据集 sales_data: 创建了一个包含日期、商品类别、地区和销售额的 DataFrame。

  • 1. 商品类别总销售额柱状图:

    • sales_data.groupby('商品类别')['销售额'].sum(): 按 '商品类别' 分组,并计算每组 '销售额' 的总和。

    • category_sales.plot(kind='bar', ax=ax, color=['skyblue', 'lightcoral']): 直接使用聚合后的 Series 数据绘制柱状图。

  • 2. 每日不同商品类别销售额堆叠柱状图:

    • sales_data.groupby(['日期', '商品类别'])['销售额'].sum().unstack(): 按 '日期' 和 '商品类别' 分组,计算总销售额,并使用 unstack() 将 '商品类别' 变为列,形成适合堆叠柱状图的数据格式。

    • daily_category_sales.plot(kind='bar', stacked=True, figsize=(10, 6)): 绘制堆叠柱状图,stacked=True 参数指定堆叠。

  • 3. 地区销售额占比饼图:

    • sales_data.groupby('地区')['销售额'].sum(): 按 '地区' 分组,计算总销售额。

    • region_sales.plot(kind='pie', autopct='%1.1f%%', figsize=(6, 6)): 绘制饼图,展示各地区销售额的占比。

  • 4. 每日总销售额折线图:

    • sales_data.groupby('日期')['销售额'].sum(): 按 '日期' 分组,计算每日总销售额。

    • daily_total_sales.plot(kind='line', marker='o', linestyle='-', figsize=(8, 5)): 绘制折线图,展示每日总销售额的趋势,marker='o' 添加圆形标记,linestyle='-' 设置线条样式为实线。

通过这些示例,我们展示了如何结合 Pandas 的数据操作功能,对数据进行灵活的处理和聚合,然后将处理后的数据用于 Matplotlib 可视化,从而实现更深入的数据分析和可视化。这种结合方式可以帮助我们从复杂的数据集中提取更有价值的洞察力。

3.2.5 总结与展望

本节深入探讨了 Matplotlib 与 Pandas 结合进行数据可视化的方法。我们学习了 Pandas 数据结构与 Matplotlib 的无缝衔接,掌握了使用 Pandas plot() 方法快速生成常用图表,以及使用 Matplotlib API 进行更精细图表定制的技巧。此外,我们还探讨了如何结合 Pandas 数据操作进行高级可视化,从而实现更复杂的数据分析和可视化流程。

总结:Matplotlib 与 Pandas 结合的优势

  • 简化代码: Pandas plot() 方法简化了可视化代码的编写,快速生成常用图表。

  • 高效数据处理: Pandas 强大的数据处理能力为可视化提供了干净、整洁的数据。

  • 灵活定制: Matplotlib API 提供了强大的定制化功能,满足各种复杂的可视化需求。

  • 提升效率: 结合 Pandas 和 Matplotlib,可以高效地完成数据分析和可视化任务,加速数据洞察的发现过程。

展望:更高级的可视化应用

掌握 Matplotlib 和 Pandas 的结合使用,为更高级的可视化应用打下了坚实的基础。未来可以进一步探索:

  • 更复杂图表类型: 例如,3D 图表、等高线图、流场图等。

  • 交互式可视化: 结合 Plotly, Bokeh 等库,创建交互式图表,提升用户体验。

  • 动态可视化: 创建动画或实时更新的图表,展示数据随时间变化的趋势。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U