跳到主要内容

Python Matplotlib基础

Matplotlib简介

Matplotlib是Python中最受欢迎的数据可视化库之一,它提供了一个面向对象的API,用于在各种平台上嵌入图表到应用程序中。无论您是分析科学数据、制作股票市场图表,还是简单地想要呈现数据的趋势,Matplotlib都能提供强大而灵活的工具。

备注

Matplotlib由John Hunter于2003年创建,旨在为Python提供类似MATLAB的绘图功能。如今,它已成为Python数据科学生态系统中不可或缺的一部分。

安装Matplotlib

在开始使用Matplotlib之前,我们需要安装它。可以使用pip或conda进行安装:

python
# 使用pip安装
pip install matplotlib

# 使用conda安装
conda install matplotlib

Matplotlib基本组件

在深入学习之前,了解Matplotlib的基本组件非常重要:

  1. Figure:整个图像窗口
  2. Axes:图表区域,包含数据绘图
  3. Axis:坐标轴(x和y轴)
  4. Artist:图表中的所有可见元素

创建简单的线图

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

python
import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100) # 0到10之间的100个点
y = np.sin(x) # 正弦函数

# 创建图表
plt.figure(figsize=(8, 4)) # 设置图表大小
plt.plot(x, y) # 绘制线图

# 添加标题和标签
plt.title('正弦函数曲线')
plt.xlabel('x轴')
plt.ylabel('sin(x)')

# 显示网格
plt.grid(True)

# 显示图表
plt.show()

执行上述代码会生成一个正弦函数的曲线图,类似于这样:

图表会显示一个在0到10的x轴范围内的正弦波,带有标题"正弦函数曲线"以及x轴和y轴的标签。

子图的使用

Matplotlib允许在一个图形中创建多个子图:

python
import matplotlib.pyplot as plt
import numpy as np

# 准备数据
x = np.linspace(0, 2 * np.pi, 100)

# 创建2x2的子图布局
fig, axs = plt.subplots(2, 2, figsize=(10, 8))

# 第一个子图:正弦函数
axs[0, 0].plot(x, np.sin(x))
axs[0, 0].set_title('正弦函数')

# 第二个子图:余弦函数
axs[0, 1].plot(x, np.cos(x), 'r') # 'r'表示红色
axs[0, 1].set_title('余弦函数')

# 第三个子图:正弦平方函数
axs[1, 0].plot(x, np.sin(x)**2, 'g--') # 'g--'表示绿色虚线
axs[1, 0].set_title('正弦平方函数')

# 第四个子图:余弦平方函数
axs[1, 1].plot(x, np.cos(x)**2, 'b-.') # 'b-.'表示蓝色点划线
axs[1, 1].set_title('余弦平方函数')

# 调整子图间距
plt.tight_layout()

# 显示图表
plt.show()

这段代码会创建一个2×2的子图布局,每个子图显示不同的数学函数。

常见图表类型

1. 柱状图

柱状图适合展示分类数据:

python
import matplotlib.pyplot as plt
import numpy as np

# 数据
categories = ['苹果', '香蕉', '橙子', '梨', '葡萄']
values = [25, 32, 18, 27, 23]

plt.figure(figsize=(10, 5))
plt.bar(categories, values, color='skyblue')
plt.title('水果销售量')
plt.xlabel('水果类型')
plt.ylabel('销售量(箱)')
plt.show()

2. 散点图

散点图用于可视化两个变量之间的关系:

python
import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
np.random.seed(42) # 设置随机种子以保证结果可复现
x = np.random.rand(50) # 50个0到1之间的随机数
y = x + np.random.normal(0, 0.2, 50) # 添加一些噪声

plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.7, s=100) # alpha设置透明度,s设置点的大小
plt.title('散点图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.grid(True)
plt.show()

3. 饼图

饼图适合展示部分与整体的关系:

python
import matplotlib.pyplot as plt

# 数据
labels = ['编程', '睡觉', '吃饭', '娱乐', '学习']
sizes = [35, 25, 15, 10, 15]
explode = (0.1, 0, 0, 0, 0) # 突出"编程"部分

plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
plt.axis('equal') # 保证饼图是圆的
plt.title('日常活动时间分配')
plt.show()

4. 直方图

直方图用于展示数值数据的分布:

python
import matplotlib.pyplot as plt
import numpy as np

# 生成正态分布随机数
data = np.random.normal(0, 1, 1000)

plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, color='skyblue', alpha=0.7)
plt.title('正态分布直方图')
plt.xlabel('值')
plt.ylabel('频率')
plt.grid(True, alpha=0.3)
plt.show()

自定义图表样式

Matplotlib提供了丰富的自定义选项,让我们看一些常用的样式设置:

1. 线条样式和颜色

python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

plt.figure(figsize=(10, 6))

# 不同的线条样式
plt.plot(x, np.sin(x), 'r-', label='红色实线') # 红色实线
plt.plot(x, np.sin(x+1), 'g--', label='绿色虚线') # 绿色虚线
plt.plot(x, np.sin(x+2), 'b-.', label='蓝色点划线') # 蓝色点划线
plt.plot(x, np.sin(x+3), 'c:', label='青色点线') # 青色点线

plt.title('不同线条样式示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)
plt.show()

2. 添加注释

python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y, 'b-')

# 添加文字注释
plt.annotate('最大值', xy=(np.pi/2, 1), xytext=(np.pi/2+1, 0.8),
arrowprops=dict(facecolor='black', shrink=0.05))

# 添加数学公式
plt.text(5, 0, r'$y=\sin(x)$', fontsize=15)

plt.title('带注释的正弦函数')
plt.grid(True)
plt.show()

3. 调整刻度和刻度标签

python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y)

# 设置x轴刻度为π的倍数
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi],
['0', r'$\pi/2$', r'$\pi$', r'$3\pi/2$', r'$2\pi$'])

plt.title('调整刻度的正弦函数')
plt.grid(True)
plt.show()

保存图表

将图表保存为各种格式非常简单:

python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure(figsize=(8, 6))
plt.plot(x, y, 'r-')
plt.title('保存的图表示例')

# 保存为PNG格式(也支持jpg, pdf, svg等)
plt.savefig('sine_wave.png', dpi=300, bbox_inches='tight')

plt.show()
提示

bbox_inches='tight'参数可以确保图表的所有部分(包括标签和标题)都被保存在图像中。 dpi参数控制图像分辨率,值越高,保存的图像质量越好,但文件也越大。

实际应用案例:疫情数据可视化

让我们通过一个实际例子来应用我们学到的知识,绘制模拟的COVID-19疫情数据:

python
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta

# 创建日期范围(90天)
base_date = datetime(2023, 1, 1)
dates = [base_date + timedelta(days=i) for i in range(90)]

# 模拟数据
np.random.seed(42)
new_cases = np.random.normal(1000, 200, 90) # 新增病例
new_cases = np.maximum(0, new_cases) # 确保没有负数
new_cases = np.cumsum(new_cases) # 累计病例
recovered = np.roll(new_cases, 14) * 0.95 # 14天后95%的人康复
recovered[:14] = 0

# 计算活跃病例
active_cases = new_cases - recovered

# 创建图表
plt.figure(figsize=(12, 7))

# 绘制曲线
plt.plot(dates, new_cases, 'b-', label='累计确诊')
plt.plot(dates, recovered, 'g-', label='累计康复')
plt.plot(dates, active_cases, 'r-', label='活跃病例')

# 填充活跃病例区域
plt.fill_between(dates, active_cases, alpha=0.3, color='red')

# 设置标题和标签
plt.title('COVID-19疫情模拟数据')
plt.xlabel('日期')
plt.ylabel('人数')
plt.grid(True, alpha=0.3)
plt.legend()

# 格式化x轴日期
plt.gcf().autofmt_xdate()

# 添加注释指出峰值
peak_index = np.argmax(active_cases)
peak_date = dates[peak_index]
peak_value = active_cases[peak_index]
plt.annotate(f'峰值: {int(peak_value)}',
xy=(peak_date, peak_value),
xytext=(peak_date + timedelta(days=10), peak_value + 1000),
arrowprops=dict(facecolor='black', shrink=0.05))

plt.tight_layout()
plt.show()

这个例子展示了如何绘制时间序列数据,并添加注释突出显示重要信息。

Matplotlib样式与主题

Matplotlib提供了多种预设样式,您可以轻松切换:

python
import matplotlib.pyplot as plt
import numpy as np

# 可用的样式列表
print(plt.style.available)

# 使用特定样式
plt.style.use('seaborn-darkgrid')

x = np.linspace(0, 10, 100)
plt.figure(figsize=(8, 4))
plt.plot(x, np.sin(x))
plt.title('使用Seaborn暗网格样式的图表')
plt.show()

总结

在本教程中,我们学习了:

  1. Matplotlib的基础组件和结构
  2. 如何创建各种类型的图表(线图、柱状图、散点图、饼图、直方图)
  3. 如何自定义图表(颜色、样式、注释、标签)
  4. 如何创建子图
  5. 如何保存图表到文件
  6. 如何应用样式和主题
  7. 一个实际的数据可视化案例

Matplotlib是一个功能强大的库,本教程只涵盖了其功能的一小部分。随着您继续学习,您将发现更多高级功能和技术。

练习和扩展学习

  1. 练习1:创建一个展示过去10年中国GDP增长的折线图。
  2. 练习2:使用子图创建4种不同类型的图表(线图、柱状图、散点图、饼图)。
  3. 练习3:创建一个三维图表(提示:研究mplot3d工具包)。

延伸资源

Matplotlib是Python数据可视化的基础,掌握它将为您的数据分析和展示工作增添强大的工具。随着您对这个库越来越熟悉,您将能够创建更复杂、更有吸引力的数据可视化。

警告

记住,好的数据可视化应该是清晰和直观的,不要过度装饰您的图表,始终确保它们能够有效地传达您想要的信息。