Python Matplotlib基础
Matplotlib简介
Matplotlib是Python中最受欢迎的数据可视化库之一,它提供了一个面向对象的API,用于在各种平台上嵌入图表到应用程序中。无论您是分析科学数据、制作股票市场图表,还是简单地想要呈现数据的趋势,Matplotlib都能提供强大而灵活的工具。
Matplotlib由John Hunter于2003年创建,旨在为Python提供类似MATLAB的绘图功能。如今,它已成为Python数据科学生态系统中不可或缺的一部分。
安装Matplotlib
在开始使用Matplotlib之前,我们需要安装它。可以使用pip或conda进行安装:
# 使用pip安装
pip install matplotlib
# 使用conda安装
conda install matplotlib
Matplotlib基本组件
在深入学习之前,了解Matplotlib的基本组件非常重要:
- Figure:整个图像窗口
- Axes:图表区域,包含数据绘图
- Axis:坐标轴(x和y轴)
- Artist:图表中的所有可见元素
创建简单的线图
让我们从创建一个简单的线图开始:
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允许在一个图形中创建多个子图:
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. 柱状图
柱状图适合展示分类数据:
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. 散点图
散点图用于可视化两个变量之间的关系:
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. 饼图
饼图适合展示部分与整体的关系:
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. 直方图
直方图用于展示数值数据的分布:
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. 线条样式和颜色
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. 添加注释
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. 调整刻度和刻度标签
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()
保存图表
将图表保存为各种格式非常简单:
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疫情数据:
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提供了多种预设样式,您可以轻松切换:
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()
总结
在本教程中,我们学习了:
- Matplotlib的基础组件和结构
- 如何创建各种类型的图表(线图、柱状图、散点图、饼图、直方图)
- 如何自定义图表(颜色、样式、注释、标签)
- 如何创建子图
- 如何保存图表到文件
- 如何应用样式和主题
- 一个实际的数据可视化案例
Matplotlib是一个功能强大的库,本教程只涵盖了其功能的一小部分。随着您继续学习,您将发现更多高级功能和技术。
练习和扩展学习
- 练习1:创建一个展示过去10年中国GDP增长的折线图。
- 练习2:使用子图创建4种不同类型的图表(线图、柱状图、散点图、饼图)。
- 练习3:创建一个三维图表(提示:研究
mplot3d
工具包)。
延伸资源
Matplotlib是Python数据可视化的基础,掌握它将为您的数据分析和展示工作增添强大的工具。随着您对这个库越来越熟悉,您将能够创建更复杂、更有吸引力的数据可视化。
记住,好的数据可视化应该是清晰和直观的,不要过度装饰您的图表,始终确保它们能够有效地传达您想要的信息。