线性代数和数据挖掘(三):Matplotlib库和数据可视化

部署运行你感兴趣的模型镜像

一、思维导图

请添加图片描述

二、Matplotlib基础:从安装到核心概念

2.1 为什么选择Matplotlib?

Matplotlib是一款基于Python的开源绘图库,设计初衷是提供"类MATLAB风格"的API,让熟悉MATLAB的用户能快速上手。它的核心优势体现在四个方面:

  • 低门槛上手:API逻辑清晰,从"导入库→准备数据→绘制图表→显示保存"的流程固定,初学者30分钟就能画出第一个线图。
  • 超高可定制性:小到线条宽度、标记颜色,大到图表布局、字体样式,几乎所有视觉元素都能调整,满足个性化需求。
  • 多数据源兼容:能直接处理列表、NumPy数组、Pandas DataFrame等主流数据格式,无需复杂的数据转换。
  • 跨平台稳定性:完美支持Windows、Linux、macOS三大操作系统,生成的图表可导出为PNG、PDF、SVG等10+种格式。

重难点标注:Matplotlib的核心是"层级结构"——Figure(画布)包含Axes(绘图区域),Axes包含坐标轴、线条、标记等元素,理解这一结构是后续复杂绘图的基础。

2.2 环境准备:5分钟完成安装与导入

2.2.1 安装命令

Matplotlib是第三方库,需通过pip安装,打开终端输入以下命令(Python环境需提前配置):

pip install matplotlib
# 若需处理数值计算,建议同时安装NumPy(后续示例会用到)
pip install numpy
2.2.2 常规导入方式

行业通用约定是将matplotlib.pyplot缩写为plt,这能简化代码,同时保证可读性:

import matplotlib.pyplot as plt  # 核心绘图模块
import numpy as np               # 用于生成测试数据(非必需但常用)

三、核心图表实战:从基础到定制

3.1 线图:展示数据趋势的"万能工具"

线图是最常用的图表类型,适合展示连续数据的变化趋势(如时间序列、函数曲线),核心函数是plt.plot()

3.1.1 函数原型与关键参数
plt.plot(x, y, fmt, **kwargs)
  • 必选参数
    • x:x轴坐标数据(列表/数组),若不指定,默认用range(len(y))(即0,1,2…)。
    • y:y轴坐标数据(列表/数组),核心数据来源。
  • 可选参数
    • fmt:字符串格式,快速设置"颜色+标记+线型",例如'ro--'表示"红色+圆圈标记+虚线"。
    • **kwargs:关键字参数,用于精细定制,常用的有:
      • label:图例名称(配合plt.legend()显示)。
      • linewidth/lw:线条宽度(数值越大越粗)。
      • marker:数据点标记样式(如'o'圆圈、's'正方形,完整样式见下文表格)。
      • alpha:透明度(0=完全透明,1=不透明)。
3.1.2 常用线型与标记样式表
类型字符说明类型字符说明
线型-实线标记o圆圈
线型--虚线标记s正方形
线型-.虚点线标记^上三角
线型:点线标记+加号
标记.句号点标记x乘号
3.1.3 实战案例1:正弦曲线
import matplotlib.pyplot as plt  # 核心绘图模块
import numpy as np               # 用于生成测试数据(非必需但常用)

# 1. 准备数据:生成0到3π的连续x值,步长0.1(保证曲线平滑)
x = np.arange(0, 3 * np.pi, 0.1)  # np.arange是NumPy的等差数组函数
y = np.sin(x)                     # 计算x对应的正弦值

# 2. 绘制线图:精细设置样式
plt.plot(
    x, y,          # 核心数据
    '-',           # 线型:实线
    label='Sine Wave',  # 图例名称
    linewidth=2,        # 线宽2
    color='blue',       # 线条颜色:蓝色
    marker='o',         # 标记:圆圈
    markersize=5,       # 标记大小5
    markeredgecolor='black',  # 标记边缘颜色:黑色
    markeredgewidth=1,        # 标记边缘宽度1
    markerfacecolor='none',   # 标记内部:透明(只显示边缘)
    alpha=0.5                 # 整体透明度0.5
)

# 3. 添加辅助元素
plt.xlabel('x (Radians)')  # x轴标签:说明x的含义(弧度)
plt.ylabel('sin(x)')       # y轴标签:说明y的含义(正弦值)
plt.legend()               # 显示图例(依赖label参数)
plt.title('Sine Wave Plot')# 图表标题

# 4. 显示与保存
plt.show()  # 弹出窗口显示图表
# plt.savefig('sine_wave.png', dpi=300, bbox_inches='tight')  # 保存为高清PNG(dpi=分辨率)

运行效果
请添加图片描述

3.1.4 实战案例2:直线图(两点确定一条线)
import matplotlib.pyplot as plt  # 核心绘图模块
import numpy as np               # 用于生成测试数据(非必需但常用)

# 1. 准备数据:两个点的坐标(x从0到5,y从0到10)
x = np.array([0, 5])  # x轴两个点:0和5
y = np.array([0, 10]) # y轴对应点:0和10

# 2. 绘制直线
plt.plot(
    x, y,
    '-',
    label='Line between (0,0) and (5,10)',
    color='red',        # 线条颜色:红色
    linewidth=2,
    marker='o',
    markersize=10,      # 标记更大(10),更醒目
    markeredgecolor='black',
    markeredgewidth=2,
    alpha=1.0           # 不透明,突出直线
)

# 3. 辅助元素
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Simple Line Plot')

# 4. 显示
plt.show()

运行效果请添加图片描述

3.2 散点图:展示数据分布与相关性

散点图用于展示两个变量的关系(如身高与体重),或按第三个变量映射颜色/大小(如按"性别"分颜色),核心函数是plt.scatter()

3.2.1 核心参数解析
  • s:散点大小(标量/数组,数组可实现"每个点大小不同")。
  • c:散点颜色(单个颜色/数组,数组配合cmap可实现颜色渐变)。
  • cmap:颜色映射表(如'viridis''plasma',Matplotlib内置20+种)。
  • edgecolors:散点边缘颜色(避免点重叠时看不清)。
3.2.2 实战案例:正弦曲线散点图(带颜色映射)
import matplotlib.pyplot as plt  # 核心绘图模块
import numpy as np               # 用于生成测试数据(非必需但常用)

# 1. 准备数据
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
colors = y  # 用y值(正弦值)映射颜色:y越大,颜色越亮

# 2. 绘制散点图
scatter = plt.scatter(
    x, y,
    s=10,               # 散点大小10
    c=colors,           # 颜色由y值决定
    marker='o',
    cmap='viridis',     # 颜色映射:蓝→绿→黄
    vmin=-1,            # 颜色最小值(对应y=-1)
    vmax=1,             # 颜色最大值(对应y=1)
    alpha=0.5,
    linewidths=0.5,     # 散点边缘宽度
    edgecolors='white'  # 边缘白色,增强对比度
)

# 3. 辅助元素:添加颜色条(说明颜色与y值的对应关系)
plt.colorbar(scatter, label='sin(x) Value')  # colorbar绑定散点图,添加标签
plt.xlabel('x (Radians)')
plt.ylabel('sin(x)')
plt.title('Sine Wave Scatter Plot')

# 4. 显示
plt.show()

运行效果
请添加图片描述

3.3 条形图:对比不同类别的数据

条形图(柱状图)适合对比多个类别的数值(如各部门销售额、各学科平均分),核心函数是plt.bar(),支持横向/纵向条形、堆叠条形等变种。

3.3.1 关键参数
  • x:条形的x轴位置(通常是类别标签,如[‘A’,‘B’,‘C’])。
  • height:条形的高度(核心数据,对应类别数值)。
  • width:条形宽度(默认0.8,数组可实现"每个条形宽度不同")。
  • hatch:条形内部填充图案(如'x'交叉线、'/'斜线,增加视觉区分)。
  • color/facecolor:条形填充颜色。
3.3.2 实战案例:带中文标签的条形图

Matplotlib默认不支持中文字体,需手动设置,这是实战中的常见"坑点",以下代码已解决:

import matplotlib.pyplot as plt  # 核心绘图模块
import numpy as np              

# 1. 解决中文显示问题(关键步骤)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows用"SimHei",macOS用"Arial Unicode MS"
plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示为方块的问题

# 2. 准备数据:类别标签和对应数值
labels = ['类别A', '类别B', '类别C', '类别D', '类别E']
values = [23, 45, 56, 78, 33]

# 3. 绘制条形图
plt.bar(
    labels,        # x轴:类别标签
    values,        # y轴:条形高度(数值)
    width=0.3,     # 条形宽度0.3,避免拥挤
    color='blue',  # 填充颜色:蓝色
    edgecolor='red',# 边缘颜色:红色
    linewidth=2,   # 边缘宽度2
    linestyle='-', # 边缘线型:实线
    alpha=0.7,     # 透明度0.7
    hatch='x',     # 内部填充:交叉线
    label='数值对比'# 图例名称
)

# 4. 辅助元素
plt.xlabel('类别')
plt.ylabel('数值')
plt.title('中文标签条形图')
plt.legend()

# 5. 显示
plt.show()

运行效果
请添加图片描述

3.4 饼图:展示部分与整体的比例

饼图用于展示各部分占总体的比例(如市场份额、成分占比),核心函数是plt.pie(),支持扇区分离、百分比显示等功能。

3.4.1 关键参数
  • x:各扇区的大小(数值,Matplotlib会自动计算比例)。
  • explode:扇区突出程度(数组,0=不突出,0.1=突出10%,用于强调某部分)。
  • autopct:百分比显示格式(如'%1.1f%%'表示保留1位小数的百分比)。
  • startangle:饼图起始角度(0=x轴正方向,逆时针旋转)。
  • wedgeprops:扇区属性(如边缘颜色、宽度)。
3.4.2 实战案例:带突出扇区的饼图
import matplotlib.pyplot as plt
 

# 1. 准备数据
sizes = [25, 35, 20, 20]  # 各部分大小(总和100,直接对应百分比)
labels = ['部分A', '部分B', '部分C', '部分D']
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']  # 各扇区颜色
explode = [0, 0.1, 0, 0]  # 突出"部分B"(第2个扇区)

# 2. 绘制饼图
plt.pie(
    sizes,                  # 各扇区大小
    explode=explode,        # 扇区突出设置
    labels=labels,          # 扇区标签
    colors=colors,          # 扇区颜色
    autopct='%1.1f%%',      # 百分比格式:如35.0%
    startangle=140,         # 起始角度140度(避免"部分A"在正右方)
    shadow=False,           # 不添加阴影
    radius=1,               # 饼图半径1(默认大小)
    wedgeprops=dict(        # 扇区边缘属性
        edgecolor='black', 
        linewidth=2, 
        linestyle='-'
    ),
    textprops=dict(         # 文本属性(标签和百分比)
        color='red', 
        weight='bold'       # 粗体
    )
)

# 3. 辅助元素:确保饼图为正圆形(避免拉伸)
plt.axis('equal')  # 关键!使x轴和y轴比例一致
plt.title('饼图示例(突出部分B)')

# 4. 显示
plt.show()

运行效果
请添加图片描述

四、进阶功能:布局与Figure操作

4.1 坐标轴与标签:让图表更易懂

4.1.1 常用辅助函数
  • plt.xlabel()/plt.ylabel():设置x/y轴标签(说明轴的含义,如"时间(秒)")。
  • plt.title():设置图表标题(概括图表内容,如"2024年月度销售额趋势")。
  • plt.legend():显示图例(依赖plot()/scatter()等函数的label参数)。
4.1.2 示例代码
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y, label='Sine Wave')

# 添加辅助标签
plt.xlabel('x (Radians)', fontsize=12)  # 可设置字体大小
plt.ylabel('sin(x)', fontsize=12)
plt.title('Sine Wave with Labels', fontsize=14, pad=20)  # pad=标题与图表的间距
plt.legend(fontsize=10)

plt.show()

输出结果:
请添加图片描述

4.2 子图布局:在一个画布上画多个图

当需要对比多个图表(如正弦和余弦曲线同屏显示)时,子图布局是关键,常用方法有plt.subplot()plt.subplots()GridSpec

4.2.1 方法1:plt.subplot()(简单子图)

语法:plt.subplot(nrows, ncols, plot_number),表示"n行n列的子图网格,当前操作第plot_number个(从1开始)"。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 3 * np.pi, 0.01)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 第一个子图:2行1列,第1个
plt.subplot(2, 1, 1)
plt.plot(x, y_sin)
plt.title('Sine Wave')

# 第二个子图:2行1列,第2个
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine Wave')

# 自动调整间距,避免标签重叠
plt.tight_layout()
plt.show()

运行效果
请添加图片描述

4.2.2 方法2:plt.subplots()(批量创建子图)

语法:fig, axs = plt.subplots(nrows, ncols),返回Figure对象和子图数组axs,适合批量操作。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.01)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = 1/(1+np.exp(-x))  # Sigmoid函数

# 创建2行2列的子图网格
fig, axs = plt.subplots(2, 2, figsize=(10, 8))  # figsize=画布大小(英寸)

# 第1个子图(0行0列)
axs[0, 0].plot(x, y1)
axs[0, 0].set_title('Sine Wave')  # 子图标题用set_title()
axs[0, 0].set_xlabel('x')         # 子图轴标签用set_xlabel()

# 第2个子图(0行1列)
axs[0, 1].plot(x, y2)
axs[0, 1].set_title('Cosine Wave')
axs[0, 1].set_xlabel('x')

# 第3个子图(1行0列)
axs[1, 0].plot(x, y3)
axs[1, 0].set_title('Tangent Wave')
axs[1, 0].set_xlabel('x')

# 第4个子图(1行1列)
axs[1, 1].plot(x, y4)
axs[1, 1].set_title('Sigmoid Function')
axs[1, 1].set_xlabel('x')

# 调整间距
plt.tight_layout()
plt.show()

运行效果
请添加图片描述

4.2.3 方法3:GridSpec(灵活子图,跨列/跨行)

当需要非均匀子图(如某子图跨2列)时,GridSpec是最佳选择,支持定制列宽、行高比例。

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import matplotlib

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']  # 设置支持中文的字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 创建画布
fig = plt.figure(figsize=(10, 6))

# 定义GridSpec:2行3列,列宽比例2:1:1,行高比例1:1.5
gs = GridSpec(
    nrows=2,
    ncols=3,
    width_ratios=[2, 1, 1],  # 第1列宽度是第2、3列的2倍
    height_ratios=[1, 1.5]   # 第2行高度是第1行的1.5倍
)

# 添加子图:按GridSpec定位
ax1 = fig.add_subplot(gs[0, 0])  # 第1行第1列
ax2 = fig.add_subplot(gs[0, 1])  # 第1行第2列
ax3 = fig.add_subplot(gs[0, 2])  # 第1行第3列
ax4 = fig.add_subplot(gs[1, 0])  # 第2行第1列
ax5 = fig.add_subplot(gs[1, 1:]) # 第2行第2~3列(跨2列)

# 为子图添加文本标识
ax1.text(0.5, 0.5, '子图1\n(1行1列)', ha='center', va='center', fontsize=12)
ax2.text(0.5, 0.5, '子图2\n(1行2列)', ha='center', va='center', fontsize=12)
ax3.text(0.5, 0.5, '子图3\n(1行3列)', ha='center', va='center', fontsize=12)
ax4.text(0.5, 0.5, '子图4\n(2行1列)', ha='center', va='center', fontsize=12)
ax5.text(0.5, 0.5, '子图5\n(2行2-3列)', ha='center', va='center', fontsize=12)

# 调整间距
plt.tight_layout()
plt.show()

运行效果
请添加图片描述

4.3 Figure对象:画布的"总控台"

Figure是Matplotlib的顶级对象,代表整个画布,所有子图、文本、图例都在Figure上,常用方法如下:

方法名功能描述示例代码
add_subplot()添加子图(基于行列定位)fig.add_subplot(2,1,1)
add_axes()在任意位置添加子图(自定义坐标)fig.add_axes([0.1,0.1,0.5,0.5])
suptitle()添加画布总标题(子图标题之上)fig.suptitle('总标题', fontsize=16)
set_size_inches()设置画布大小(英寸)fig.set_size_inches(10,6)
get_dpi()获取画布分辨率(DPI)print(fig.get_dpi())
tight_layout()自动调整子图间距fig.tight_layout()
实战案例:Figure方法综合使用
import matplotlib.pyplot as plt


# 1. 显式创建Figure对象
fig = plt.figure(figsize=(8, 6), facecolor='lightgray')  # 画布大小8x6,背景浅灰色

# 2. 添加子图
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)

# 3. 绘制数据
ax1.plot([1,2,3], [1,4,9], label='y=x²')
ax2.plot([1,2,3], [3,2,1], label='y=4-x')

# 4. Figure方法操作
fig.suptitle('Figure总标题', fontsize=14, color='red')  # 总标题
fig.set_size_inches(10, 7)  # 调整画布大小
print(f"画布DPI:{fig.get_dpi()}")  # 打印分辨率
fig.tight_layout()  # 调整间距

# 5. 子图辅助元素
ax1.legend()
ax2.legend()

# 6. 显示
plt.show()

运行结果为
请添加图片描述

4.4 其他实用工具

4.4.1 保存图表:plt.savefig()
# 保存为PNG,分辨率300DPI(高清),紧凑剪裁空白
plt.savefig(
    'my_plot.png',
    dpi=300,
    bbox_inches='tight',  # 关键:避免标签被截断
    facecolor='white'     # 背景色
)
4.4.2 显示图像:plt.imshow()

用于显示二维图像数据(如图片、热力图),与plt.show()的区别是:imshow()创建图像,show()显示所有图像。

# 生成随机10x10图像数据
data = np.random.rand(10, 10)
plt.imshow(data, cmap='viridis')  # cmap=颜色映射
plt.colorbar()  # 显示颜色条
plt.show()
4.4.3 关闭图表:plt.close()
plt.close()  # 关闭当前图表
# plt.close('all')  # 关闭所有图表,释放内存
4.4.4 暂停:plt.pause()

用于动画或交互式绘图,暂停指定秒数(如plt.pause(0.01)暂停0.01秒)。

五、总结

重点是四大图表:
1.线图
2.散点图
3.条形图
4.饼图
三大布局系统:
1.plt.subplot:简单快速子图创建
2.plt.subplots:批量生成子图数组,代码更整洁
3.GridSpec:灵活复杂布局,支持跨行跨列

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrliu__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值