前言:
Matplotlib 是一个 Python 的图表绘制库,广泛用于生成各种静态、动态和交互式的图表。它能够创建线图、散点图、条形图、饼图、直方图、误差线图、箱型图、热图、子图网络、散点矩阵等图表。
安装 Matplotlib:
pip install matplotlib
如果安装失败也可使用国内源来安装:
pip install matplotlib -i https://mirrors.aliyun.com/pypi/simple/
常用参数解释:
在 Matplotlib 中,图表的窗体(整个图像)称为 Figure,而窗体中的每一个独立的图表区域称为 Axes(轴域)。一个 Figure 中可以包含多个 Axes,但是一个 Axes 只能在一个 Figure 中。下面是对 Matplotlib 中 Axes 以及其他参数的一些说明:
Figure:是 Matplotlib 中图表的顶级容器。它包含了图表中的所有元素。
Axes(轴域):轴域(Axes)是图表的核心部分。一个Axes对象代表图表中的一个绘图区域,并包含两个(或三个用于3D图)坐标轴(Axis对象),这些坐标轴负责数据的定位,它是图像的一个区域,可以在此区域中绘制各种图表。Axes 对象提供了大量方法,例如 .plot(), .scatter(), .bar() 等,用于创建各种图表。
创建轴域: add_axes()方法可以在图形中添加一个轴域,通常需要传入一个列表参数:[left, bottom, width, height],这些值都是在 0 到 1 范围内,代表着相对于整个图形的位置和大小。
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 主轴域
ax2 = fig.add_axes([0.2, 0.6, 0.3, 0.2]) # 嵌入的小轴域
Axis(轴):是指图表的 x 轴和 y 轴,分别控制图表的水平和垂直方面。它们负责设置图表的限制、生成刻度和刻度标签。
轴标题和标签: 轴域上可以设置标题、X 轴标签和 Y 轴标签:
ax1.set_title('Main Plot')
ax1.set_xlabel('X Axis')
ax1.set_ylabel('Y Axis')
Tick:刻度是轴上的标记,表示特定的数据点。刻度分为主刻度和副刻度,每个都有其对应的标签。
刻度和刻度标签: 可以定制轴域上的刻度位置和刻度标签:
ax1.set_xticks([1, 2, 3, 4])
ax1.set_xticklabels(['one', 'two', 'three', 'four'])
Spine:是图表的边框,通常一个图表有四个边框:上、下、左、右。
# 获取当前轴域的所有 'spine'
spines = ax.spines
# 设置右侧和顶部 'spine' 不可见
spines['right'].set_visible(False)
spines['top'].set_visible(False)
# 将底部 'spine' 移动到 y = 0 处
spines['bottom'].set_position(('data', 0))
# 将左侧 'spine' 改成红色且加粗
spines['left'].set_color('red')
spines['left'].set_linewidth(2)
Grid:网格线,可以帮助用户识别图中的数据点。
网格: 可以开启或者定制网格的显示:
ax1.grid(True)
Legend(图例):解释图表中各个数据系列的标识,通常用颜色或图案区分。
ax1.plot(x, y, label='Line 1')
ax1.plot(x, y*2, label='Line 2')
ax1.legend(loc='best') # 自动选择最佳位置显示图例
Title(标题):图表的标题,通常位于图表的顶部。
ax1.set_title('Sine Wave') # 设置标题
ax1.set_xlabel('X-axis') # 设置X轴标签
ax1.set_ylabel('Y-axis') # 设置Y轴标签
1 应用示例 :
#!/usr/bin/env python
# coding=utf-8
"""
# @Time : 2024/4/11 23:00
# @Author : Summer
# @File : matplotlib.py
# @describe:
"""
import matplotlib.pyplot as plt
import numpy as np
# 创建一个Figure对象
fig = plt.figure(figsize=(8, 6))
# 使用 add_subplot 方法向 Figure 添加 Axes 对象
ax1 = fig.add_subplot(2, 2, 1) # 第一个轴域(位于2行2列的网格的第1个位置)
ax2 = fig.add_subplot(2, 2, 2) # 第二个轴域(位于2行2列的网格的第2个位置)
ax3 = fig.add_subplot(2, 2, 3) # 第三个轴域(位于2行2列的网格的第3个位置)
# 在第一个轴域中绘制一个线图
x = np.arange(0, 10, 0.2)
y = np.sin(x)
ax1.plot(x, y)
ax1.set_title('Sine Wave') # 设置标题
ax1.set_xlabel('X-axis') # 设置X轴标签
ax1.set_ylabel('Y-axis') # 设置Y轴标签
# 设置第二个轴域的柱状图
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 30]
ax2.bar(categories, values)
ax2.set_title('Bar Chart')
# 设置第三个轴域的散点图
x = np.random.rand(50)
y = np.random.rand(50)
ax3.scatter(x, y)
ax3.set_title('Scatter Plot')
plt.tight_layout() # 调整子图参数,使之填充整个图像区域
plt.show()
在这个例子中,每个轴域都有自己的图表类型和标题,并且轴域能够被单独控制和定制。使用轴域对象的方法,我们可以精确地添加和控制图表的属性,如标题、网格线、刻度等。通常,你会发现自己需要根据你的数据和展示需求来调整诸如布局、标签位置、轴范围、颜色、图表类型等多个参数。
此外,Matplotlib 提供了大量的绘图方法和定制选项。以下是一些常见的图表类型及其用法示例:
2 线图(Line plot):
绘制线形图表来表示数据点之间的连线。
#!/usr/bin/env python
# coding=utf-8
"""
# @Time : 2024/4/11 23:00
# @Author : Summer
# @File : matplotlib.py
# @describe:
"""
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]
plt.plot(x, y)
plt.show()
3 散点图(Scatter plot):
用来观察两个变量的关系,显示为一组点。
#!/usr/bin/env python
# coding=utf-8
"""
# @Time : 2024/4/11 23:00
# @Author : Summer
# @File : matplotlib.py
# @describe:
"""
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50)
y = np.random.rand(50)
plt.scatter(x, y)
plt.show()
4 条形图(Bar plot):
用来表示分类变量数据,通常用于比较每个类别。
5 直方图(Histogram):
用于展示数据分布情况的图表,通常是对数据进行BINNING然后统计频次。
6 饼图(Pie chart):
饼图用于显示数据组成的占比。
#!/usr/bin/env python
# coding=utf-8
"""
# @Time : 2024/4/11 23:00
# @Author : Summer
# @File : matplotlib.py
# @describe:
"""
import matplotlib.pyplot as plt
import numpy as np
sizes = [25, 35, 20, 20]
labels = ['Category A', 'Category B', 'Category C', 'Category D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.axis('equal') # 等比例显示
plt.show()
子图(Subplots):
在同一窗口中创建多个图表。
#!/usr/bin/env python
# coding=utf-8
"""
# @Time : 2024/4/11 23:00
# @Author : Summer
# @File : matplotlib.py
# @describe:
"""
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50)
y = np.random.rand(50)
# 创建一个 2x1 的子图结构
plt.subplot(2, 1, 1)
plt.plot(x, y, 'r--') # 红色虚线
plt.subplot(2, 1, 2)
plt.plot(y, x, 'g*-') # 绿色星状线
plt.show()
总结:
用途广泛: Matplotlib 被广泛用于数据可视化,支持多种图表类型,例如线图 (line plots)、散点图(scat-ter plots)、条形图 (bar charts)、饼图 (pie charts)、直方图 (histograms)、箱线图 (box plots)、热图 (heatmaps)、子图 (subplots) 等。
架构组成: 主要由四个层构成,即脚本层(pyplot API)、艺术家层(Artist API)、后端层(Backend Layer)和文档对象模型层(Document object model)。
功能强大: 支持图表的高度定制,包括坐标轴、图例、标题、刻度标签、样式、颜色、网格以及图表注释等。
灵活性: 可以对图表元素进行细粒度控制,也提供了较为简单的命令式接口用于快速绘制。
兼容性: 整合了许多的第三方包和框架,例如 Pandas、SciPy 和 scikit-learn。
扩展性: 可以扩展到其他库中,如 Seaborn 和 ggplot,用于更高级的统计图表绘制。
图像格式: 支持多种输出格式,如 PNG、PDF、SVG、EPS 以及 JPEG 等。
交互性: 提供了事件处理机制,可以创建交互式图表和动画。
总的来说,Matplotlib 是 Python 中一个功能全面且广泛被使用的绘图库,适合用在科学计算、数据分析、人工智能和机器学习等领域。然而,针对一些特定的应用场景,如 Web 集成或实时更新的大数据集,可能需要考虑其他如 Bokeh 或 Plotly 这类更现代化的图表库。为了深入理解和掌握 Axes 对象,查看 Matplotlib 官方文档中的 Axes API 部分是非常有帮助的:https://matplotlib.org/stable/api/axes_api.html