Python绘图库matplotlib详解:从入门到实战应用 – wiki基地

Matplotlib 详解:从入门到实战应用

Matplotlib 是 Python 中最受欢迎的数据可视化库之一,它提供了广泛的绘图功能,可以创建各种静态、交互式和动画图表。无论是简单的折线图、散点图,还是复杂的 3D 图形、等高线图,Matplotlib 都能胜任。本文将带您深入了解 Matplotlib,从基础概念到高级应用,助您掌握数据可视化的强大工具。

1. Matplotlib 基础

1.1 安装与导入

Matplotlib 通常与 NumPy 一起使用,因此在安装 Matplotlib 之前,请确保已安装 NumPy。可以使用 pip 安装 Matplotlib:

bash
pip install matplotlib

安装完成后,在 Python 代码中导入 Matplotlib 的 pyplot 模块:

python
import matplotlib.pyplot as plt
import numpy as np # 通常也需要 NumPy

pyplot 模块提供了一个类似于 MATLAB 的绘图接口,非常方便使用。

1.2 基本绘图元素

一个 Matplotlib 图形通常包含以下几个基本元素:

  • Figure(画布): 整个图形窗口,可以包含多个 Axes。
  • Axes(坐标轴): 实际绘图的区域,包含 x 轴、y 轴、标题、图例等。一个 Figure 可以包含多个 Axes。
  • Axis(轴): x 轴和 y 轴,控制数据的范围和刻度。
  • Title(标题): 图表的标题。
  • Label(标签): x 轴和 y 轴的标签。
  • Legend(图例): 区分不同数据系列的标识。
  • Line(线): 折线图中的线条。
  • Marker(标记): 散点图中的点或其他标记。
  • Grid(网格): 背景网格线。
  • Text(文本): 图表中的任意文本。

1.3 第一个绘图示例

让我们从一个简单的折线图开始:

“`python
import matplotlib.pyplot as plt
import numpy as np

创建数据

x = np.linspace(0, 10, 100) # 0 到 10 之间均匀分布的 100 个点
y = np.sin(x)

创建图形和坐标轴

fig, ax = plt.subplots()

绘制折线图

ax.plot(x, y)

添加标题和标签

ax.set_title(“Sine Wave”)
ax.set_xlabel(“x”)
ax.set_ylabel(“sin(x)”)

显示图形

plt.show()
“`

这段代码首先创建了 x 和 y 数据,然后使用 plt.subplots() 创建了一个 Figure 和一个 Axes 对象。ax.plot(x, y) 在 Axes 上绘制了折线图。ax.set_title(), ax.set_xlabel(), 和 ax.set_ylabel() 分别设置了标题和轴标签。最后,plt.show() 显示图形。

2. 常见图表类型

Matplotlib 支持多种图表类型,以下是一些常见的图表及其绘制方法:

2.1 折线图 (Line Plot)

折线图用于显示数据随时间或其他连续变量的变化趋势。

“`python

示例代码已在上面给出

“`

2.2 散点图 (Scatter Plot)

散点图用于显示两个变量之间的关系。

“`python
x = np.random.rand(50)
y = np.random.rand(50)

plt.scatter(x, y)
plt.title(“Scatter Plot”)
plt.xlabel(“x”)
plt.ylabel(“y”)
plt.show()
“`

2.3 条形图 (Bar Chart)

条形图用于比较不同类别的数据。

“`python
categories = [‘A’, ‘B’, ‘C’, ‘D’]
values = [25, 40, 15, 30]

plt.bar(categories, values)
plt.title(“Bar Chart”)
plt.xlabel(“Categories”)
plt.ylabel(“Values”)
plt.show()
“`

2.4 水平条形图(Horizontal Bar Chart)

“`python
categories = [‘A’, ‘B’, ‘C’, ‘D’]
values = [25, 40, 15, 30]

plt.barh(categories, values) # barh 替换 bar
plt.title(“Horizontal Bar Chart”)
plt.xlabel(“Values”)
plt.ylabel(“Categories”)
plt.show()
“`

2.5 直方图 (Histogram)

直方图用于显示数据分布的频率。

“`python
data = np.random.randn(1000) # 1000 个标准正态分布的随机数

plt.hist(data, bins=30) # bins 指定柱子的数量
plt.title(“Histogram”)
plt.xlabel(“Values”)
plt.ylabel(“Frequency”)
plt.show()
“`

2.6 饼图 (Pie Chart)

饼图用于显示各部分占总体的比例。

“`python
labels = [‘A’, ‘B’, ‘C’, ‘D’]
sizes = [15, 30, 45, 10]

plt.pie(sizes, labels=labels, autopct=’%1.1f%%’) # autopct 显示百分比
plt.title(“Pie Chart”)
plt.show()
“`

2.7 箱线图 (Box Plot)

箱线图用于显示数据的分布情况,包括中位数、四分位数、异常值等。

“`python
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

plt.boxplot(data)
plt.title(“Box Plot”)
plt.xlabel(“Groups”)
plt.ylabel(“Values”)
plt.show()
“`

2.8 等高线图 (Contour Plot)

“`python

创建网格数据

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X2 + Y2))

绘制等高线图

plt.contour(X, Y, Z)
plt.title(“Contour Plot”)
plt.xlabel(“x”)
plt.ylabel(“y”)
plt.show()
“`

2.9 3D 绘图

“`python
from mpl_toolkits.mplot3d import Axes3D # 导入3D绘图工具

创建3D图形

fig = plt.figure()
ax = fig.add_subplot(111, projection=’3d’)

创建数据

x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X2 + Y2))

绘制3D曲面

ax.plot_surface(X, Y, Z)

ax.set_title(“3D Surface Plot”)
ax.set_xlabel(“x”)
ax.set_ylabel(“y”)
ax.set_zlabel(“z”)
plt.show()
“`

3. 自定义图表样式

Matplotlib 提供了丰富的选项来自定义图表的外观,包括线条样式、颜色、标记、字体、图例等。

3.1 线条样式和颜色

可以使用 plot() 函数的 linestylecolormarker 参数来控制线条的样式、颜色和标记。

“`python
x = np.linspace(0, 10, 20)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, linestyle=’-‘, color=’blue’, marker=’o’, label=’sin(x)’)
plt.plot(x, y2, linestyle=’–‘, color=’red’, marker=’x’, label=’cos(x)’)

plt.legend()
plt.show()
“`

常用的线条样式:

  • -:实线
  • --:虚线
  • -.:点划线
  • ::点线

常用的颜色:

  • b:蓝色
  • g:绿色
  • r:红色
  • c:青色
  • m:品红色
  • y:黄色
  • k:黑色
  • w:白色

常用的标记:

  • o:圆圈
  • x:叉号
  • +:加号
  • *:星号
  • .:点
  • s:正方形
  • d:菱形
  • ^:上三角形
  • v:下三角形
  • <:左三角形
  • >:右三角形

3.2 字体和文本

可以使用 fontdict 参数来控制文本的字体、大小、颜色等。

“`python
title_font = {‘family’: ‘serif’, ‘color’: ‘darkred’, ‘weight’: ‘bold’, ‘size’: 16}
label_font = {‘family’: ‘sans-serif’, ‘color’: ‘darkblue’, ‘weight’: ‘normal’, ‘size’: 12}

plt.title(“Title”, fontdict=title_font)
plt.xlabel(“x”, fontdict=label_font)
plt.ylabel(“y”, fontdict=label_font)

plt.show()
“`

3.3 图例

可以使用 legend() 函数来添加图例。

“`python
plt.plot(x, y1, label=’sin(x)’)
plt.plot(x, y2, label=’cos(x)’)

plt.legend(loc=’upper right’) # loc 指定图例位置
plt.show()
“`

3.4 坐标轴范围和刻度

可以使用 xlim(), ylim(), xticks(), 和 yticks() 函数来控制坐标轴的范围和刻度。

python
plt.plot(x, y)
plt.xlim(0, 10) # 设置 x 轴范围
plt.ylim(-1, 1) # 设置 y 轴范围
plt.xticks(np.arange(0, 11, 2)) # 设置 x 轴刻度
plt.yticks(np.arange(-1, 1.1, 0.5)) # 设置 y 轴刻度
plt.show()

3.5 网格线

可以使用 grid() 函数来添加网格线。

python
plt.plot(x, y)
plt.grid(True, linestyle='--', alpha=0.5) # alpha 控制透明度
plt.show()

3.6 添加文本注释

可以使用 text() 函数在图表中添加文本注释,使用 annotate() 函数添加箭头指示的注释。

“`python
plt.plot(x, y)
plt.text(2, 0.5, “Text Example”, fontsize=12) #在(2,0.5)的位置添加文本

添加箭头注释

plt.annotate(“Important Point”, xy=(4, np.sin(4)), xytext=(6, 0.5),
arrowprops=dict(facecolor=’black’, shrink=0.05))
plt.show()
“`

3.7 颜色映射(Colormap)

对于散点图、等高线图等,可以使用颜色映射来表示数据的第三个维度。

“`python
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100) #用随机数作为颜色值

plt.scatter(x, y, c=colors, cmap=’viridis’) #cmap指定颜色映射
plt.colorbar() #显示颜色条
plt.show()
“`

4. 子图和布局

Matplotlib 允许在一个 Figure 中创建多个 Axes(子图),并灵活地控制它们的布局。

4.1 plt.subplots()

plt.subplots() 函数是最常用的创建子图的方法,它可以一次性创建多个子图,并返回一个 Figure 对象和一个包含 Axes 对象的 NumPy 数组。

“`python
fig, axes = plt.subplots(nrows=2, ncols=2) # 创建 2×2 的子图

在每个子图中绘制不同的图形

axes[0, 0].plot(x, np.sin(x))
axes[0, 1].scatter(x, np.cos(x))
axes[1, 0].hist(np.random.randn(100))
axes[1, 1].pie([1, 2, 3, 4])

plt.show()
“`

4.2 plt.subplot()

plt.subplot() 函数也可以创建子图,但它每次只能创建一个子图。

“`python
plt.subplot(2, 2, 1) # 2×2 的子图,当前是第 1 个
plt.plot(x, np.sin(x))

plt.subplot(2, 2, 2)
plt.scatter(x, np.cos(x))

plt.subplot(2, 2, 3)
plt.hist(np.random.randn(100))

plt.subplot(2, 2, 4)
plt.pie([1, 2, 3, 4])

plt.show()
“`

4.3 调整子图间距

可以使用 plt.tight_layout() 函数自动调整子图之间的间距,避免重叠。

“`python
fig, axes = plt.subplots(2, 2)

… 绘制子图 …

plt.tight_layout()
plt.show()
“`

也可以使用subplots_adjust函数手动调整间距:
“`python
fig, axes = plt.subplots(2, 2)

… 绘制子图 …

plt.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4)

left, bottom, right, top: 图形边缘与画布边缘的距离

wspace, hspace: 子图之间的水平和垂直间距

plt.show()

“`

4.4 共享坐标轴

创建子图时,可以通过sharexsharey参数来共享x轴或y轴。

“`python
fig, axes = plt.subplots(2, 1, sharex=True) #共享x轴

axes[0].plot(x, np.sin(x))
axes[1].plot(x, np.cos(x))

plt.show()
“`

5. 实战应用

5.1 数据分析与可视化

Matplotlib 经常与 Pandas 结合使用,对数据进行分析和可视化。

“`python
import pandas as pd

读取数据

data = pd.read_csv(“data.csv”) # 假设有一个名为 data.csv 的文件

数据清洗和处理

数据可视化

plt.plot(data[“x”], data[“y”])
plt.title(“Data Visualization”)
plt.xlabel(“x”)
plt.ylabel(“y”)
plt.show()
“`

5.2 科学绘图

Matplotlib 广泛应用于科学研究领域,用于绘制各种科学图表。 绘制论文中常用的高质量图表。

“`python

设置全局字体为 Times New Roman

plt.rcParams[‘font.family’] = ‘Times New Roman’
plt.rcParams[‘font.size’] = 12

创建数据和绘图

x = np.linspace(0, 10, 100)
y = np.sin(x) * np.exp(-x/3)

plt.plot(x, y, linewidth=2, color=’blue’)
plt.xlabel(“Time (s)”, fontsize=14)
plt.ylabel(“Amplitude”, fontsize=14)
plt.title(“Damped Sine Wave”, fontsize=16)
plt.grid(True, linestyle=’:’, alpha=0.6)
plt.xlim(0, 10)
plt.ylim(-0.5, 1)

添加图例

plt.legend([“Signal”], loc=’upper right’, frameon=False) #frameon=False移除图例边框

保存为高质量图片 (例如 PDF, SVG)

plt.savefig(“damped_sine_wave.pdf”, dpi=300) #dpi设置分辨率
plt.savefig(“damped_sine_wave.svg”)

plt.show()

“`

5.3 机器学习结果可视化

Matplotlib 可以用于可视化机器学习模型的训练过程和结果。

“`python

假设有一个训练好的模型和测试数据

可视化训练损失

plt.plot(history.history[‘loss’], label=’train_loss’)
plt.plot(history.history[‘val_loss’], label=’val_loss’)
plt.legend()
plt.show()

可视化预测结果

plt.scatter(y_test, y_pred)
plt.xlabel(“True Values”)
plt.ylabel(“Predictions”)
plt.show()
“`

6. 总结

Matplotlib 是一个功能强大且灵活的数据可视化库,它提供了丰富的绘图功能和自定义选项,可以满足各种数据可视化需求。通过本文的学习,您应该已经掌握了 Matplotlib 的基础知识和常见用法,并能够创建各种类型的图表,自定义图表样式,以及进行子图布局。希望本文能帮助您更好地利用 Matplotlib 进行数据可视化,从而更深入地理解数据,发现数据背后的规律和价值。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部