python学习-使用matplotlib绘制图表
本文介绍在 python 中如何使用
matplotlib
绘制图表,包括基本图表元素的使用、折线图、散点图、直方图、随机数的应用、读取 CSV 数据绘制图表和一些高级应用等。供自己以后查漏补缺,也欢迎同道朋友交流学习。
引言
上面 4 篇都是处理各种文档,有时我们还有图表类数据可视化的需求。本章节主要介绍如何使用 matplotlib
绘制图表,包括基本图表元素的使用、折线图、散点图、直方图、随机数的应用、读取 CSV 数据绘制图表和一些高级应用等。
Matplotlib库
Matplotlib
是一个在 Python
中广泛使用的开源数据可视化库。它提供了一个强大的工具集,用于创建高质量的图形
。
它的设计哲学是类似于 MATLAB
的绘图框架,不仅能够生成简单的图表,如折线图
和散点图
,还能够创建复杂的图表,包括3D图
、等高线图
和自定义
的绘图。
核心功能
Matplotlib
的核心功能包括:
- 多种图表类型:支持
折线图
、散点图
、柱状图
、直方图
、箱线图
等。 - 自定义功能:用户可以
自定义图表
的几乎每个方面,包括轴
、标签
、图例
、标题
等。 - 动画和交互式图表:支持创建
动画
和交互式图表
。 - 多种输出格式:图表可以保存为多种格式,包括
PNG
、PDF
、SVG
和EPS
。 - 与多种库集成:可以与
Pandas
、NumPy
等其他Python
库无缝集成。
安装依赖
pip install matplotlib
# or
pip3 install matplotlib
Matplotlib基本图表元素
导入必要的模块
最常用的模块是 pyplot
,它提供了一个类似于 MATLAB
的接口,使得绘图变得简单直观。
import matplotlib.pyplot as plt
图表、坐标轴和子图
- 图表(Figure):图表是
Matplotlib
中所有绘图元素的顶层容器。一个图表可以包含一个或多个坐标轴(Axes
)对象,并在其中添加多个子图。
# 创建一个图表实例
fig = plt.figure()
# 创建一个子图
ax = fig.add_subplot(1, 1, 1) # 参数分别代表行数、列数和子图编号
- 坐标轴(Axes):坐标轴是图表中的一个区域,用于显示数据的范围和刻度。每个图表可以包含多个坐标轴。
# 创建一个坐标轴对象
ax = plt.axes()
# 绘制数据
ax.plot([1, 2, 3], [4, 5, 6])
- 子图(Subplot):子图是图表中的一个特定部分,允许你在同一个图表窗口中展示多个相关的图形。子图的布局可以通过行数、列数和子图编号来指定。
# 创建一个包含两个子图的图表
fig, (ax1, ax2) = plt.subplots(1, 2)
# 在第一个子图中绘制数据
ax1.plot([1, 2, 3], [4, 5, 6])
# 在第二个子图中绘制数据
ax2.plot([1, 2, 3], [6, 5, 4])
简单折线图的绘制
折线图
是数据可视化中最常用的图表类型之一,它非常适合展示数据随时间变化的趋势。
import matplotlib.pyplot as plt
# X轴数据
x = [1, 2, 3, 4, 5]
# Y轴数据
y = [2, 4, 6, 8, 10]
y2 = [1, 2, 3, 7, 9]
# 绘制折线图
plt.plot(x, y, label='折线1', color='red')
plt.plot(x, y2, label='折线2', color='green', linestyle='--', marker='o', markerfacecolor='blue', markersize=10)
# color:颜色
# linestyle:线条样式
# marker:标记点样式
# markerfacecolor:标记点颜色
# 添加图例
plt.legend()
# 添加标题和标签
plt.rcParams['font.sans-serif'] = ['SimSong'] # 显示中文标签
plt.title('折线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图形
plt.show()
图表显示如下:
图表的高级应用
保存图表为不同格式
Matplotlib
允许将图表保存为多种不同的图像格式,包括PNG
、JPEG
、SVG
、PDF
等。这对于生成报告或网页中的静态图像非常有用。
import matplotlib.pyplot as plt
# 假设你已经有一个图表
plt.plot([1, 2, 3], [4, 5, 6])
# 保存为PNG格式
plt.savefig('line.png')
# 保存为PDF格式
plt.savefig('line.pdf')
# 保存为SVG格式
plt.savefig('line.svg')
# 保存为JPEG格式
plt.savefig('line.jpeg')
# 一些额外的选项
plt.savefig('line.png', dpi=300) # 设置图像分辨率
plt.savefig('line.pdf', bbox_inches='tight') # 去除周围的空白区域
散点图的绘制
使用 scatter
方法可以创建一个基本的散点图。
# 散点图
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 9, 10]
# 创建散点图:自定义点的大小和颜色
plt.scatter(x, y, s=100, c='blue', alpha=0.5, edgecolors='w')
# s 点的大小
# c 点的颜色
# alpha 点的透明度
# edgecolors 点的边缘颜色
# 添加标题和标签
plt.rcParams['font.sans-serif'] = ['SimSong'] # 显示中文标签
plt.title('散点图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图形
plt.show()
图表显示如下:
随机数的应用
随机数
在数据分析和模拟中扮演着重要的角色。它们可以用于生成模拟数据
、进行随机抽样
、以及在机器学习中初始化参数等。NumPy
库提供了生成随机数的强大工具。
NumPy随机数生成
import numpy as np
# 设置随机数种子以获得可重复的结果
np.random.seed(0)
# 生成10个0到1之间的随机数
random_numbers = np.random.rand(10)
print('生成10个0到1之间的随机数:')
print(random_numbers)
print()
# 生成10个标准正态分布的随机数
data = np.random.randn(10)
print('生成100个标准正态分布的随机数:')
print(data)
print()
# 生成正态分布数据
normal_data = np.random.normal(loc=0, scale=1, size=10) # 均值为0,标准差为1
print('生成正态分布数据:')
print(normal_data)
print()
# 生成均匀分布数据
uniform_data = np.random.uniform(low=0, high=10, size=10) # 从0到10的均匀分布
print('生成均匀分布数据:')
print(uniform_data)
print()
随机数据的可视化
随机数据的可视化有助于我们理解数据的分布特性和动态变化。
随机数据的分布:
随机数据的分布可以通过直方图来展示。直方图能够直观地显示数据的分布情况,包括数据的集中趋势和离散程度。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
random_data = np.random.normal(loc=0, scale=1, size=1000)
# 绘制直方图
plt.hist(random_data, bins=30, alpha=0.7, color='blue', edgecolor='black')
# 添加标题和标签
plt.rcParams['font.sans-serif'] = ['SimSong'] # 显示中文标签
plt.title('随机数据的分布示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图表
plt.show()
图表显示如下:
随机漫步:
随机漫步
是指一个粒子在每一步都有相同概率
随机地向任意方向移动的过程。
import matplotlib.pyplot as plt
import numpy as np
# 初始化位置
position = 0
steps = 100
x = [position]
y = [0]
# 随机漫步
for _ in range(steps):
step = np.random.choice([-1, 1])
x.append(x[-1] + step)
y.append(y[-1] + step)
# 绘制随机漫步
plt.plot(y, marker='o')
# 添加标题和标签
plt.rcParams['font.sans-serif'] = ['SimSong'] # 显示中文标签
plt.title('随机漫步示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图表
plt.show()
图表显示如下:
布朗运动:
布朗运动
是一种连续时间随机过程,其增量是正态分布
的,并且独立于时间
。
import matplotlib.pyplot as plt
import numpy as np
# 生成布朗运动数据
np.random.seed(0)
data = np.random.normal(loc=0, scale=1, size=100)
brownian_data = np.cumsum(data)
# 绘制布朗运动
plt.plot(brownian_data, marker='o', linestyle='-', color='blue')
# 添加标题和标签
plt.rcParams['font.sans-serif'] = ['SimSong'] # 显示中文标签
plt.title('布朗运动示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图表
plt.show()
图表显示如下:
绘制多个图表
绘制多个图表可以帮助我们同时展示和比较不同的数据集。Matplotlib
提供了灵活的子图功能,允许在一个窗口
中创建多个图表
。
子图的使用
subplot
函数可以创建子图,允许多个图表并排或堆叠显示。
import matplotlib.pyplot as plt
# 创建一个包含两个子图的图表
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) # 1行2列
# figsize=(10, 4) # 图表的宽度为10,高度为4
# 在第一个子图中绘制数据
ax1.plot([1, 2, 3], [4, 5, 6])
ax1.set_title('subplot 1')
# 在第二个子图中绘制数据
ax2.scatter([1, 2, 3], [4, 5, 6])
ax2.set_title('subplot 2')
# 显示图表
plt.show()
图表显示如下:
子图的高级布局
网格布局:网格布局允许子图按照网格方式排列,这在展示多个相关图表时非常有用。
import matplotlib.pyplot as plt
# 创建网格布局的子图
fig, axs = plt.subplots(2, 2)
# 绘制子图
axs[0, 0].plot([1, 2, 3], [4, 5, 6])
axs[0, 1].plot([1, 2, 3], [6, 7, 8])
axs[1, 0].plot([1, 2, 3], [8, 7, 6])
axs[1, 1].plot([1, 2, 3], [6, 5, 4])
# 显示图表
plt.show()
图表显示如下:
子图的共享轴:
有时,我们希望子图共享同一个轴,这样可以更直观地比较不同子图之间的数据。
import matplotlib.pyplot as plt
# 创建网格布局的子图
fig, axs = plt.subplots(2, 1, sharex=True)
# 绘制子图
axs[0].plot([1, 2, 3], [4, 5, 6])
axs[1].plot([1, 2, 3], [6, 7, 8])
# 显示图表
plt.show()
图表显示如下:
动态更新图表
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
# 初始化数据
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
# 创建图表和轴
fig, ax = plt.subplots()
line, = ax.plot(x, y)
# 更新函数
def update(frame):
line.set_ydata(np.sin(x + frame / 10))
return line,
# 创建动画
ani = animation.FuncAnimation(fig, update, frames=np.linspace(0, 10, 100), interval=50, blit=True)
# 显示图表
plt.show()
图表显示如下:
直方图的绘制
直方图
是一种用于展示数据分布的图表,它将数据分组到连续的、不重叠的区间(bin)中,并以条形图的形式展示每个区间内的数据点数量。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data = np.random.randn(1000)
# 创建直方图
plt.hist(data, bins=30, alpha=0.7, color='blue', edgecolor='black')
# 添加标题和标签
plt.rcParams['font.sans-serif'] = ['SimSong'] # 显示中文标签
plt.title('直方图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图表
plt.show()
图表显示如下:
CSV文件的绘制
CSV 文件的读取上一章有介绍,这里就不再重复了。
处理CSV数据
在读取数据后,通常需要进行一些清洗和预处理,以确保数据的质量和一致性。
# 检查缺失值
print(data.isnull().sum())
# 删除缺失值
data = data.dropna()
# 重命名列
data.rename(columns={'OldColumnName': 'NewColumnName'}, inplace=True)
# 转换数据类型
data['ColumnName'] = data['ColumnName'].astype(float)
# 查看数据的描述性统计
print(data.describe())
从CSV数据创建图表
以一个一周温度变化表来举例:
temperature.csv如下:
date,highTemperature,lowTemperature
周一,20,12
周二,22,14
周三,20,13
周四,18,12
周五,19,10
周六,16,9
周日,14,8
python
代码如下:
import matplotlib.pyplot as plt
import pandas as pd
# 读取CSV文件
data = pd.read_csv('temperature.csv')
# 设置图表大小
plt.figure(figsize=(10, 5))
# 绘制最高温度折线图
plt.plot(data['date'], data['highTemperature'], label='最高温度', marker='o', color='red')
# 绘制最低温度折线图
plt.plot(data['date'], data['lowTemperature'], label='最低温度', marker='o', color='blue')
# 添加图例
plt.legend()
# 添加标题和标签
plt.rcParams['font.sans-serif'] = ['SimSong'] # 显示中文标签
plt.title('一周温度变化示例')
plt.xlabel('日期')
plt.ylabel('温度 (°C)')
# 显示图表
plt.show()
图表显示如下:
附录:颜色和标记点样式表
颜色color的种类
- 预定义颜色名: 如
'red'
,'blue'
,'green'
,'yellow'
- 十六进制颜色代码: 如
'#FF0000'
,'#00FF00'
,'#0000FF'
- RGB颜色值: 如
(1.0, 0.0, 0.0)
,(0.0, 1.0, 0.0)
,(0.0, 0.0, 1.0)
- 颜色短名称: 如
'r'
,'g'
,'b'
标记点样式marker
样式 | 描述 |
---|---|
. | 点 |
o | 实心圆 |
s | 正方形 |
^ | 三角形 |
v | 倒三角形 |
* | 星形 |
+ | 加号 |
x | 乘号 |
| | 垂直线 |
_ | 水平线 |
None | 空矩形 |
python学习专栏系列
- python学习-基础学习1
- python学习-基础学习2
- python学习-基础学习3
- python学习-面向对象编程1
- python学习-面向对象编程2
- python学习-文件读写
- python学习-程序异常处理
- python学习-正则
- python学习-处理word文档
- python学习-处理pdf文档
- python学习-处理excel文档
- python学习-处理csv文档
- python学习-使用matplotlib绘制图表
- python学习-处理JSON数据
- python学习-SQLite数据库
- python学习-多线程处理
- python学习-网络爬虫