Python Matplotlib 实现基础绘图

Python Matplotlib 是一个强大的绘图库,可以用于创建各种图表和图形。Matplotlib 的 API 非常直观,易于学习和使用。使用 Matplotlib 可以创建几种常见的图表类型,如折线图、散点图、条形图等。可以通过改变参数、添加其他图表元素(如图例、不同的线型和颜色)来创建更复杂的图表。不断实验不同的功能是理解和掌握 Matplotlib 的最佳方式。

1、Matplotlib 的三层结构

Matplotlib 是一个用于在 Python 中创建二维图表的库。为了更好地理解和使用 Matplotlib,重要的是要了解其三层结构:容器层(Container Layer)、辅助显示层(Helper Layer)和图像层(Artist Layer)。这些层级构成了 Matplotlib 的绘图体系结构。

1)容器层(Container Layer)

组件

描述

FigureCanvas

最底层的容器,

代表了绘图的整个窗口或页面。

它是一个用于绘制

和渲染所有图表元素的物理或概念性的画布。

Figure

代表了绘图窗口的顶层容器。

一个 Figure 可以包含多个 Axes 对象。

Axes

是一个包含图表大部分元素的容器,

如线条、标记、文字、标签等,

通常与“坐标轴”相关联。

一个 Axes 对象代表了图表的一个绘图区域。

2) 辅助显示层(Helper Layer)

辅助显示层是对容器层的补充,提供了一系列方便的方法来创建常见的图表(如直方图、折线图等),并处理诸如刻度定位、布局和颜色映射等常见情况。

组件

描述

pyplot 模块

是 Matplotlib 的辅助显示层,

提供了一组命令式函数来快速生成简单图表。

例如,plt.plot()plt.xlabel()plt.ylabel()等。

Axis 和 Tick 对象

Axis 对象处理刻度线、网格线、标签等,

而 Tick 对象是 Axis 的组件,

用于处理刻度线和刻度标签。

3)图像层(Artist Layer)

图像层是 Matplotlib 的核心层,包含了用于绘制图表的所有对象(称为艺术家对象,或简称“艺术家”)。

组件

描述

Artist

包括 Text(文本),Line2D(线条)

,Rectangle(矩形,用于绘制柱状图)、AxesImage(图像)等。

这些对象知道如何使用渲染器在画布上绘制自己。

Renderer

负责在 FigureCanvas 上绘制 Artist。

用户通常不直接与渲染器交互,

而是通过艺术家对象的方法间接进行。

2、使用画布(Figure)

Matplotlib 中,画布是指整个图形界面或图形的总体背景,通常在绘图之前设置。在 Matplotlib 中,画布由 Figure 对象表示。可以通过调整 Figure 对象的属性来自定义画布的大小、分辨率和边框等。plt.figure() 函数用于创建新的图形窗口,并提供了许多用于自定义这些图形窗口的参数。常用参数如下,

参数

描述

figsize

图形的大小,以英寸为单位,

传递一个元组(宽度,高度)。

dpi

图形的分辨率,

以每英寸点数(dots per inch)表示。

facecolor

图形的背景颜色。

edgecolor

图形边框的颜色。

frameon

布尔值,用于控制是否绘制图形边框。

num

图形的编号或名称。如果编号已存在,

则使用已存在的图形。

tight_layout

布尔值或字典。如果为 True,

则使用 tight layout 调整子图布局以适应图形区域。

使用示例:

import matplotlib.pyplot as plt

# 创建画布(Figure)
fig = plt.figure(figsize=(10, 6),   # 图形大小为 10x6 英寸
           dpi=80,            # 分辨率为 80 dpi
           facecolor='white', # 背景色为白色
           edgecolor='blue',  # 边框颜色为蓝色
           frameon=True,      # 绘制图形边框
           num='MyFigure',    # 图形的名称为 'MyFigure'
           tight_layout=True) # 使用 tight layout 自动调整布局

# 在画布上添加一个轴(Axes)
ax = fig.add_subplot(111)

# 在轴上绘图
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], marker='o', color='b')

# 设置标题和轴标签
ax.set_title("Simple Plot on Custom Figure")
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")

# 将画布设置为活动画布
plt.set_current_fig(fig)

# 使用 plt.draw() 显示画布
plt.draw()
# 显示图形
plt.show()

3、绘制折线图

折线图是最基本的图表类型,通常用于显示随时间变化的数据。plt.plot() 函数是用于创建线图的基本工具。常用参数如下,

参数

描述

x

线图中点的 x 坐标。

y

线图中点的 y 坐标。

color

线条的颜色,可为颜色代码或颜色名称。

linestyle

线条的样式,例如 '-', '--', '-.', ':' 等。

linewidth

线条的宽度。

marker

数据点的标记样式,例如 'o', '*', '+' 等。

markersize

标记的大小。

label

用于图例的标签。

alpha

线条的透明度,范围 0(透明)至 1(不透明)。

使用示例:

import matplotlib.pyplot as plt

# 示例数据
x = range(1, 6)
y = [1, 4, 6, 8, 4]

# 创建线图
plt.plot(x, y, color='green', linestyle='--', linewidth=2, marker='o', markersize=10, label='Data Line', alpha=0.7)

# 添加图例
plt.legend()

# 添加标题和轴标签
plt.title('Line Plot Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 显示图表
plt.show()

4、 绘制散点图

散点图通常用于显示两个变量之间的关系。plt.scatter() 函数用于创建散点图,是数据可视化中常用的一个工具。常用参数如下,

参数

描述

x

散点的 x 坐标。

y

散点的 y 坐标。

s

散点的大小,可以是单个数值或与数据点数量相等的数组。

c

散点的颜色,可以是单个颜色格式的字符串或一系列颜色。

marker

标记的样式,默认为 'o'。

alpha

散点的透明度,介于 0(完全透明)和 1(完全不透明)之间。

linewidths

标记边缘的线宽。

edgecolors

标记边缘的颜色。

label

用于图例的标签。

使用示例:

import matplotlib.pyplot as plt

# 示例数据
x = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
y = [99, 86, 87, 88, 100, 86, 103, 87, 94, 78, 77, 85, 86]
sizes = [210, 410, 312, 214, 415, 312, 213, 210, 410, 312, 214, 415, 312]
colors = ['red', 'green', 'blue', 'yellow', 'pink', 'black', 'orange', 'purple', 'beige', 'brown', 'gray', 'cyan', 'magenta']

# 创建散点图
plt.scatter(x, y, s=sizes, c=colors, marker='o', alpha=0.5, linewidths=2, edgecolors='w', label='Data Points')

# 添加图例
plt.legend()

# 添加标题和轴标签
plt.title('Custom Scatter Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 显示图表
plt.show()

5、 绘制条形图

条形图用于比较不同类别的数据。Matplotlib 库中,plt.bar() 函数是用于创建条形图的常用函数。

常用参数如下,

参数

描述

x

条形的 x 坐标。

height

条形的高度。

width

条形的宽度,默认值为 0.8。

bottom

条形的起始位置 y 坐标,默认为 None。

align

条形的对齐方式,'center' 或 'edge',

默认为 'center'。

color

条形的颜色。

edgecolor

条形边缘的颜色。

linewidth

条形边缘的线宽。

tick_label

用作条形标签的标签序列。

label

用于为条形图添加图例的标签。

使用示例:

import matplotlib.pyplot as plt

# 示例数据
categories = ['Category A', 'Category B', 'Category C', 'Category D']
values = [10, 15, 7, 12]

# 创建条形图
plt.bar(x=categories,          # x 坐标
        height=values,         # 条形的高度
        width=0.6,             # 条形的宽度
        bottom=0,              # 条形的起始位置 y 坐标
        align='center',        # 条形的对齐方式
        color='blue',          # 条形的颜色
        edgecolor='black',     # 条形边缘的颜色
        linewidth=1,           # 条形边缘的线宽
        tick_label=categories, # 条形标签
        label='Value')         # 图例标签

# 添加 x 轴和 y 轴标签
plt.xlabel('Categories')
plt.ylabel('Values')

# 添加图表标题
plt.title('Bar Chart Example')

# 显示图例
plt.legend()

# 显示图表
plt.show()

6、添加额外元素

可以添加更多元素来改进图表,例如图例、网格线和不同的样式。

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, label='sin(x)')

# 添加标题和标签
plt.title("Simple Plot of sin(x)")  # 添加标题
plt.xlabel("x")  # x轴标签
plt.ylabel("sin(x)")  # y轴标签

# 添加图例
plt.legend()

# 添加网格
plt.grid(True)

# 添加注释
plt.annotate('Local Max', xy=(1.57, 1), xytext=(2, 1.5),
             arrowprops=dict(facecolor='black', shrink=0.05))
             
# 使用 plt.draw() 显示画布
plt.draw()
# 显示图形
plt.show()

7、保存图形

Matplotlib 中,保存图形到文件是一个简单的过程。可以使用 savefig() 方法来保存图形。常用参数如下,

参数

描述

fname

输出文件的名称。字符串、类路径对象或类二进制对象。必备参数。

format

输出格式。字符串,

支持的格式为eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff。

默认值为None。

dpi

输出图像的分辨率(每英寸的像素点数)。

浮点数或'figure',如果值为'figure',输出使用图形的分辨率,

默认值为rcParams["savefig.dpi"](默认为'figure')。

quality

jpg文件输出的质量,仅对'jpg'或'jpeg'文件生效。整数,

建议取值范围为[1-95],值超过100将会禁用jpeg压缩算法,

可能会导致文件过大。默认值为rcParams["savefig.jpeg_quality"]

(默认值为95)。

facecolor

图像的背景色。颜色值或'auto',值为'auto'时,

使用当前图形的背景色。

默认值为rcParams["savefig.facecolor"](即'auto')。

edgecolor

图像边缘颜色。颜色值或'auto',

值为'auto'时,使用当前图形边缘颜色。

默认值为rcParams["savefig.edgecolor"](即'auto')。

orientation

postscript后端参数。

取值范围为{'landscape', 'portrait'}。

默认值为'portrait'。

papertype

纸张大小,仅支持postscript输出。

取值范围为{'letter', 'legal', 'executive', 'ledger', 'a0' - 'a10', 'b0' - 'b10'}。

默认值为None。

backend

使用非默认后端渲染文件。字符串。

可选参数。默认值为None。

metadata

用于存储图像元数据的键值对。

字典,取值依赖于输出图像格式和后端。

可选参数。默认值为None。

pil_kwargs

保存图像是传递给PIL.Image.Image.save的参数。

字典。可选参数。

使用示例:

import matplotlib.pyplot as plt

# 创建画布
fig = plt.figure()

# 在画布上添加一个轴
ax = fig.add_subplot(111)

# 在轴上绘图
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], marker='o', color='b')

# 设置标题
ax.set_title("Simple Plot")

# 设置轴标签
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")

# 添加图例
ax.legend(["Line 1"])

# 添加网格线
ax.grid()

# 添加注释
ax.annotate("www.cjavapy.com", (3, 27))

# 使用 plt.draw() 显示画布
plt.draw()
plt.savefig("line_plot.png")  # 保存为 PNG 文件
# 显示图形
plt.show()

推荐阅读
cjavapy编程之路首页