9.2 Pandas 与 Matplotlib / Seaborn 9.2 Pandas 与 Matplotlib / Seaborn 的集成:数据可视化利器 Pandas 提供了强大的数据处理和分析能力,而 Matplotlib 和 Seaborn 则是 Python 中最常用的数据可视化库。将 Pandas 与 Matplotlib/Seaborn 结合使用,可以轻松地将 Pandas 数据结构(如 Series 和 DataFrame)中的数据可视化,从而更好地理解数据、发现模式和交流结果。 9.2.1 Pandas 内置的可视化功能 Pandas 自身集成了一些基于 Matplotlib 的简单绘图功能,可以直接在 Series 和 DataFrame 对象上调用 方法进行可视化。
Pandas 提供了强大的数据处理和分析能力,而 Matplotlib 和 Seaborn 则是 Python 中最常用的数据可视化库。将 Pandas 与 Matplotlib/Seaborn 结合使用,可以轻松地将 Pandas 数据结构(如 Series 和 DataFrame)中的数据可视化,从而更好地理解数据、发现模式和交流结果。
Pandas 自身集成了一些基于 Matplotlib 的简单绘图功能,可以直接在 Series 和 DataFrame 对象上调用 .plot() 方法进行可视化。
基本用法:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 创建一个 Series s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10)) s.plot() plt.show() # 创建一个 DataFrame df = pd.DataFrame(np.random.randn(10, 4).cumsum(0), columns=['A', 'B', 'C', 'D'], index=np.arange(0, 100, 10)) df.plot() plt.show()
代码详解:
s.plot() 和 df.plot():这两个方法分别调用了 Matplotlib 来绘制 Series 和 DataFrame。默认情况下,DataFrame 会将每一列绘制成一条线。
plt.show():这个 Matplotlib 函数用于显示绘制的图形。
plot() 方法的常用参数:
kind:指定绘图类型,例如:
'line' (默认):折线图
'bar':条形图
'barh':水平条形图
'hist':直方图
'box':箱线图
'kde' 或 'density':密度图
'scatter':散点图
'pie':饼图
ax:指定 Matplotlib 的 Axes 对象,用于在同一个图中绘制多个图形。
subplots:如果为 True,则将 DataFrame 的每一列绘制成一个独立的子图。
sharex 和 sharey:控制子图是否共享 x 轴和 y 轴。
figsize:指定图形的大小(宽度,高度),单位为英寸。
title:设置图形的标题。
xlabel 和 ylabel:设置 x 轴和 y 轴的标签。
xlim 和 ylim:设置 x 轴和 y 轴的范围。
legend:是否显示图例。
style:指定线条的样式,例如颜色、线型、标记等。
代码示例:绘制不同类型的图:
# 条形图 df.plot(kind='bar') plt.title("Bar Chart") plt.show() # 直方图 s.plot(kind='hist', bins=20) plt.title("Histogram") plt.show() # 散点图 (需要指定 x 和 y) df.plot(kind='scatter', x='A', y='B') plt.title("Scatter Plot") plt.show()
虽然 Pandas 的 plot() 方法提供了一些基本的绘图功能,但有时我们需要更精细的控制。这时,我们可以直接使用 Matplotlib API 来定制 Pandas 生成的图形。
步骤:
使用 plt.subplots() 创建一个 Figure 对象和一个或多个 Axes 对象。
将 Axes 对象传递给 Pandas 的 plot() 方法的 ax 参数。
使用 Matplotlib API 对 Axes 对象进行定制,例如设置标题、标签、颜色、线型等。
代码示例:
fig, axes = plt.subplots(2, 1, figsize=(8, 6)) # 创建一个包含两个子图的 Figure 和 Axes 对象 # 在第一个子图中绘制 Series s.plot(ax=axes[0], color='k', linestyle='--', label='Series Data') axes[0].set_title('Series Plot with Customization') axes[0].set_xlabel('Index') axes[0].set_ylabel('Value') axes[0].legend() # 在第二个子图中绘制 DataFrame df.plot(ax=axes[1], alpha=0.7) # 设置透明度 axes[1].set_title('DataFrame Plot with Customization') axes[1].set_xlabel('Index') axes[1].set_ylabel('Value') axes[1].grid(True) # 添加网格线 plt.tight_layout() # 自动调整子图的布局,避免重叠 plt.show()
代码详解:
plt.subplots(2, 1, figsize=(8, 6)):创建一个包含 2 行 1 列子图的 Figure 对象和 Axes 对象。figsize 参数指定图形的大小。
s.plot(ax=axes[0], color='k', linestyle='--', label='Series Data'):将 Series 绘制在第一个子图 (axes[0]) 上,并设置颜色、线型和标签。
axes[0].set_title(...)、axes[0].set_xlabel(...)、axes[0].set_ylabel(...):使用 Matplotlib API 设置子图的标题和轴标签。
axes[0].legend():显示图例。
df.plot(ax=axes[1], alpha=0.7):将 DataFrame 绘制在第二个子图 (axes[1]) 上,并设置透明度。
axes[1].grid(True):添加网格线。
plt.tight_layout():自动调整子图的布局,避免重叠。
Seaborn 是一个基于 Matplotlib 的高级数据可视化库,它提供了更美观、更信息丰富的统计图形。Seaborn 可以轻松地与 Pandas DataFrame 集成,用于创建各种复杂的图表。
基本用法:
import seaborn as sns # 加载 Seaborn 自带的示例数据集 tips = sns.load_dataset('tips') # 绘制散点图 sns.scatterplot(x='total_bill', y='tip', data=tips) plt.title("Scatter Plot using Seaborn") plt.show() # 绘制直方图 sns.histplot(x='total_bill', data=tips, kde=True) # kde=True 添加核密度估计曲线 plt.title("Histogram using Seaborn") plt.show() # 绘制箱线图 sns.boxplot(x='day', y='total_bill', data=tips) plt.title("Boxplot using Seaborn") plt.show() # 绘制小提琴图 sns.violinplot(x='day', y='total_bill', data=tips) plt.title("Violinplot using Seaborn") plt.show() # 绘制成对关系图 sns.pairplot(tips) plt.show()
代码详解:
sns.load_dataset('tips'):加载 Seaborn 自带的 "tips" 数据集,这是一个关于小费的数据集。
sns.scatterplot(x='total_bill', y='tip', data=tips):绘制散点图,x 轴为 'total_bill',y 轴为 'tip',数据来自 tips DataFrame。
sns.histplot(x='total_bill', data=tips, kde=True):绘制直方图,x 轴为 'total_bill',数据来自 tips DataFrame。kde=True 添加核密度估计曲线。
sns.boxplot(x='day', y='total_bill', data=tips):绘制箱线图,x 轴为 'day',y 轴为 'total_bill',数据来自 tips DataFrame。
sns.violinplot(x='day', y='total_bill', data=tips):绘制小提琴图,x 轴为 'day',y 轴为 'total_bill',数据来自 tips DataFrame。
sns.pairplot(tips):绘制成对关系图,显示数据集中所有数值变量之间的散点图和直方图。
Seaborn 的常用函数:
sns.scatterplot():散点图
sns.lineplot():折线图
sns.histplot():直方图
sns.kdeplot():核密度估计图
sns.boxplot():箱线图
sns.violinplot():小提琴图
sns.barplot():条形图
sns.countplot():计数图
sns.heatmap():热力图
sns.pairplot():成对关系图
sns.jointplot():联合分布图
代码示例:使用 Seaborn 定制图形:
# 设置 Seaborn 的样式 sns.set_style('whitegrid') # 绘制带有颜色编码的散点图 sns.scatterplot(x='total_bill', y='tip', hue='smoker', data=tips, palette='Set1') # hue 根据 smoker 列进行颜色编码 plt.title("Scatter Plot with Color Encoding") plt.show() # 绘制分面网格图 g = sns.FacetGrid(tips, col='time', row='smoker') # 根据 time 和 smoker 列创建分面 g.map(plt.hist, 'total_bill') # 对每个分面绘制 total_bill 的直方图 plt.show()
代码详解:
sns.set_style('whitegrid'):设置 Seaborn 的样式为 "whitegrid"。
sns.scatterplot(x='total_bill', y='tip', hue='smoker', data=tips, palette='Set1'):绘制散点图,并根据 'smoker' 列进行颜色编码。palette='Set1' 指定颜色调色板。
sns.FacetGrid(tips, col='time', row='smoker'):创建一个分面网格图,根据 'time' 和 'smoker' 列创建分面。
g.map(plt.hist, 'total_bill'):对每个分面绘制 'total_bill' 的直方图。
可以使用 mermaid 绘制一个简单的关系图:
图示说明:
Pandas (A): 提供数据处理和分析功能,是数据可视化的基础。
Matplotlib (B): 是 Python 中最基础的绘图库,提供底层的绘图 API。
Seaborn (C): 是基于 Matplotlib 的高级绘图库,提供更美观、更信息丰富的统计图形。
Visualization (D): 通过 Matplotlib 和 Seaborn 实现数据可视化。
Data Processing (E): Pandas 提供数据处理能力,为可视化提供数据源。
Pandas 可以直接使用 Matplotlib 进行绘图,Seaborn 则建立在 Matplotlib 的基础上,提供了更高级的接口和更美观的样式。
Pandas 与 Matplotlib/Seaborn 的集成使得数据可视化变得更加容易和高效。通过 Pandas 处理数据,然后使用 Matplotlib 或 Seaborn 进行可视化,可以更好地理解数据、发现模式和交流结果。选择合适的库取决于你的需求:
Pandas 内置的 plot() 方法: 适用于快速生成简单的图形。
Matplotlib: 适用于需要精细控制的定制化图形。
Seaborn: 适用于生成美观、信息丰富的统计图形,例如散点图、直方图、箱线图、小提琴图等。
熟练掌握这三个库的结合使用,将极大地提升你的数据分析和可视化能力。