python学习-使用matplotlib绘制图表

281 阅读10分钟

python学习-使用matplotlib绘制图表

本文介绍在 python 中如何使用 matplotlib 绘制图表,包括基本图表元素的使用、折线图、散点图、直方图、随机数的应用、读取 CSV 数据绘制图表和一些高级应用等。

供自己以后查漏补缺,也欢迎同道朋友交流学习。

引言

上面 4 篇都是处理各种文档,有时我们还有图表类数据可视化的需求。本章节主要介绍如何使用 matplotlib 绘制图表,包括基本图表元素的使用、折线图、散点图、直方图、随机数的应用、读取 CSV 数据绘制图表和一些高级应用等。

Matplotlib库

Matplotlib 是一个在 Python 中广泛使用的开源数据可视化库。它提供了一个强大的工具集,用于创建高质量的图形

它的设计哲学是类似于 MATLAB 的绘图框架,不仅能够生成简单的图表,如折线图散点图,还能够创建复杂的图表,包括3D图等高线图自定义的绘图。

核心功能

Matplotlib 的核心功能包括:

  • 多种图表类型:支持折线图散点图柱状图直方图箱线图等。
  • 自定义功能:用户可以自定义图表的几乎每个方面,包括标签图例标题等。
  • 动画和交互式图表:支持创建动画交互式图表
  • 多种输出格式:图表可以保存为多种格式,包括PNGPDFSVGEPS
  • 与多种库集成:可以与 PandasNumPy 等其他 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()

图表显示如下:

plot-1

图表的高级应用

保存图表为不同格式

Matplotlib 允许将图表保存为多种不同的图像格式,包括PNGJPEGSVGPDF等。这对于生成报告或网页中的静态图像非常有用。

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()

图表显示如下:

plot-2

随机数的应用

随机数在数据分析和模拟中扮演着重要的角色。它们可以用于生成模拟数据、进行随机抽样、以及在机器学习中初始化参数等。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()

图表显示如下:

plot-3

随机漫步

随机漫步是指一个粒子在每一步都有相同概率随机地向任意方向移动的过程。

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()

图表显示如下:

plot-4

布朗运动

布朗运动是一种连续时间随机过程,其增量是正态分布的,并且独立于时间

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()

图表显示如下:

plot-5

绘制多个图表

绘制多个图表可以帮助我们同时展示和比较不同的数据集。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()

图表显示如下:

plot-6

子图的高级布局

网格布局:网格布局允许子图按照网格方式排列,这在展示多个相关图表时非常有用。

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()

图表显示如下:

plot-7

子图的共享轴

有时,我们希望子图共享同一个轴,这样可以更直观地比较不同子图之间的数据。

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()

图表显示如下:

plot-8

动态更新图表

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()

图表显示如下:

plot-9

直方图的绘制

直方图是一种用于展示数据分布的图表,它将数据分组到连续的、不重叠的区间(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()

图表显示如下:

plot-10

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()

图表显示如下:

plot-11

附录:颜色和标记点样式表

颜色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-study