杰瑞科技汇

matplotlib如何快速上手绘图?

matplotlib 是 Python 最基础、最核心的数据绘图库,它功能强大,高度可定制,几乎可以绘制任何你想要的静态、动态和交互式图表,很多其他流行的可视化库(如 Seaborn、Pandas 的内置绘图功能)都是建立在 matplotlib 之上的。

matplotlib如何快速上手绘图?-图1
(图片来源网络,侵删)

为什么使用 Matplotlib?

  • 基础且强大:它是 Python 数据可视化的基石,提供了最底层的绘图控制。
  • 高度可定制:你可以控制图表的几乎每一个元素(坐标轴、线条、颜色、标签、图例等)。
  • 兼容性好:与 NumPy、Pandas 等科学计算库无缝集成。
  • 丰富的图表类型:支持线图、散点图、柱状图、直方图、饼图、箱线图、热力图、3D 图等。
  • 广泛的应用:从简单的数据探索到学术论文的图表制作,都能胜任。

核心概念与基本用法

理解 matplotlib 的基本工作原理是高效使用它的关键。

a. 架构

matplotlib 的架构可以分为三层:

  1. 后端层:负责处理图形的渲染和显示,将图形渲染成 PNG、SVG 图片,或者在交互式窗口中显示,通常我们不需要直接接触这一层。
  2. 艺术家层:这是 matplotlib 的核心,你看到的所有图表元素(如图表、坐标轴、线条、文本、图例等)都是一个“Artist”对象,你可以通过创建和修改这些对象来精确控制图表的方方面面,这是进行高级定制的主要方式。
  3. 脚本层 (Scripting Layer - pyplot):这是大多数用户接触的层面。matplotlib.pyplot 模块提供了一个类似 MATLAB 的接口,它简化了绘图过程,让你能用几行代码快速创建图表,它在底层自动管理了 Artist 对象的创建和更新。

推荐:对于初学者和大多数日常任务,直接使用 pyplot 足矣,当你需要对图表进行精细控制时,就需要深入了解 Artist 层。

b. 基本绘图流程

一个典型的 matplotlib 绘图流程如下:

matplotlib如何快速上手绘图?-图2
(图片来源网络,侵删)
  1. 导入库

    import matplotlib.pyplot as plt
    import numpy as np # 通常会和 numpy 一起使用
  2. 准备数据

    x = np.linspace(0, 10, 100) # 创建一个从0到10的数组,包含100个点
    y = np.sin(x)
  3. 创建图表和坐标轴plt.figure() 创建一个图表窗口(一个 Figure 对象),plt.subplots() 可以同时创建图表和一组坐标轴(一个 Axes 对象)。Axes 是绘图的实际区域,我们大部分操作都在 Axes 上进行。

    fig, ax = plt.subplots() # 推荐的方式,可以获得 ax 对象进行更灵活的控制
    # 或者简单点
    # plt.figure()
  4. 在坐标轴上绘图: 使用 ax.plot()ax.scatter()ax.bar() 等方法。

    ax.plot(x, y, label='sin(x)', color='blue', linestyle='--')
  5. 添加图表元素(装饰图表): 添加标题、坐标轴标签、图例、网格等。

    ax.set_title("Sine Wave") # 设置标题
    ax.set_xlabel("X-axis")   # 设置x轴标签
    ax.set_ylabel("Y-axis")   # 设置y轴标签
    ax.legend()              # 显示图例
    ax.grid(True)             # 显示网格
  6. 显示或保存图表plt.show() 在一个新窗口中显示图表。plt.savefig() 将图表保存为文件。

    plt.savefig("sine_wave.png") # 保存为PNG文件
    plt.show()                  # 显示图表

常用图表类型示例

a. 线图

最常用的图表,用于展示数据随时间或某个连续变量的变化趋势。

import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.arange(0, 5, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制两条线
ax.plot(x, y1, label='Sine', color='blue', linestyle='-')
ax.plot(x, y2, label='Cosine', color='red', linestyle='--')
# 添加装饰
ax.set_title("Sine and Cosine Waves")
ax.set_xlabel("Angle in radians")
ax.set_ylabel("Value")
ax.legend()
ax.grid(True)
plt.show()

b. 散点图

用于展示两个变量之间的关系。

import matplotlib.pyplot as plt
import numpy as np
# 准备数据
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50) # 点的大小
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制散点图
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
# 添加颜色条
fig.colorbar(scatter, ax=ax, label="Color Value")
# 添加装饰
ax.set_title("Random Scatter Plot")
ax.set_xlabel("X Value")
ax.set_ylabel("Y Value")
plt.show()

c. 柱状图

用于比较不同类别之间的数据大小。

import matplotlib.pyplot as plt
# 准备数据
categories = ['A', 'B', 'C', 'D']
values = [15, 30, 45, 10]
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制柱状图
bars = ax.bar(categories, values, color=['skyblue', 'salmon', 'lightgreen', 'gold'])
# 在柱子上方添加数值标签
ax.bar_label(bars, fmt='%d')
# 添加装饰
ax.set_title("Category Comparison")
ax.set_xlabel("Category")
ax.set_ylabel("Value")
plt.show()

d. 直方图

用于展示数据的分布情况。

import matplotlib.pyplot as plt
import numpy as np
# 准备数据 (生成1000个符合正态分布的随机数)
data = np.random.randn(1000)
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制直方图
ax.hist(data, bins=30, color='purple', alpha=0.7, edgecolor='black')
# 添加装饰
ax.set_title("Distribution of Random Data")
ax.set_xlabel("Value")
ax.set_ylabel("Frequency")
plt.show()

样式与美化

matplotlib 提供了多种方式来美化图表。

a. 内置样式

matplotlib 内置了多种预设样式,可以一键改变图表的整体外观。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 设置样式
plt.style.use('seaborn-v0_8-darkgrid') # 尝试 'ggplot', 'bmh', 'fivethirtyeight' 等
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title("Styled Plot")
plt.show()

b. 使用 rcParams 全局配置

你可以通过修改 matplotlib.rcParams 字典来全局设置字体、线宽、颜色等。

import matplotlib.pyplot as plt
import numpy as np
# 全局设置
plt.rcParams.update({
    'font.size': 12,
    'font.family': 'serif',
    'axes.labelsize': 14,
    'axes.titlesize': 16,
    'xtick.labelsize': 10,
    'ytick.labelsize': 10,
    'lines.linewidth': 2,
    'grid.color': 'gray',
    'grid.linestyle': ':'
})
x = np.linspace(0, 10, 100)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title("Global RCParams Styled Plot")
plt.show()

与 Pandas 的结合使用

在数据分析中,我们通常使用 Pandas 处理数据,然后用 matplotlib 进行可视化,Pandas 的 DataFrameSeries 对象内置了 .plot() 方法,该方法底层就是调用 matplotlib

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建一个 Pandas DataFrame
data = {
    'Date': pd.to_datetime(pd.date_range('20250101', periods=10)),
    'Sales': np.random.randint(100, 500, size=10),
    'Profit': np.random.randint(20, 100, size=10)
}
df = pd.DataFrame(data)
df.set_index('Date', inplace=True)
# 使用 Pandas 内置的 plot 方法
# kind='line' 是默认值
df.plot(kind='line', 
        title='Sales and Profit Over Time', 
        ylabel='Amount ($)',
        marker='o', # 在数据点上添加圆圈标记
        colormap='viridis') # 使用颜色映射
# 获取当前的坐标轴对象,并添加图例
plt.gca().legend(title='Metrics') 
plt.grid(True)
plt.show()
# 绘制柱状图
df.plot(kind='bar', 
        title='Sales and Profit by Day', 
        ylabel='Amount ($)',
        figsize=(10, 6))
plt.show()

进阶技巧

a. 子图

在一个图表窗口中绘制多个小图表。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建一个 2x1 的子图布局
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
# 在第一个子图上绘制
ax1.plot(x, y1, 'r-')
ax1.set_title('Sine Wave')
ax1.grid(True)
# 在第二个子图上绘制
ax2.plot(x, y2, 'b-')
ax2.set_title('Cosine Wave')
ax2.set_xlabel('X-axis')
ax2.grid(True)
# 调整子图间距,防止标签重叠
plt.tight_layout()
plt.show()

b. 3D 绘图

需要导入 Axes3D 工具包。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
# 准备数据
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# 绘制3D曲面
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)
ax.set_title("3D Surface Plot")
plt.show()

总结与学习资源

matplotlib 是一个功能极其丰富的库,本指南只涵盖了其核心用法,要精通它,需要大量的实践和查阅官方文档。

核心要点

  • plt.subplots() 开始,获取 ax 对象进行操作是更现代和灵活的方式。
  • 数据准备 -> 创建画布 -> 绘图 -> 装饰 -> 显示/保存”的流程。
  • 善用 plt.stylercParams 快速美化图表。
  • 与 Pandas 结合使用,能让数据分析流程更顺畅。

学习资源

分享:
扫描分享到社交APP
上一篇
下一篇