matplotlib 机器学习绘图


安装:

pip install matplotlib

介绍

Matplotlib 是 Python 中最常用的 2D 绘图库,也可以用来绘制 3D 图形。它提供了一套面向对象(OO)和基于 pyplot 的 MATLAB 风格接口,几乎能画出所有静态、动态、交互式的图表。

matplotlib/
├─ init.py      # 顶层命名空间,常用别名 import matplotlib as mpl
├─ pyplot.py        # MATLAB 风格接口,最常用 import matplotlib.pyplot as plt
├─ artist.py        # 绘图元素基类
├─ axes.py          # Axes 对象
├─ figure.py        # Figure 对象
├─ axis.py          # X/YAxis 对象
├─ backend_*.py     # 各后端实现

matplotlib.pyplot

最常用的高层接口,直接操作当前 figure/axes,函数式调用。

典型函数:plot、scatter、hist、imshow、subplots、savefig、show 等。

matplotlib.figure

管理整张图(Figure 对象),包含一个或多个 Axes。

matplotlib.axes

真正的“画布”,所有绘图都在 Axes 上完成。

关键方法:plot、bar、pie、contour、pcolormesh、annotate 等。

子模块 matplotlib.axes.Axes 中 >200 个绘图/辅助方法。

函数名称 描述
Plot 折线图或点图
Scatter 绘制x与y的散点图
Bar 绘制条形图
Barh 绘制水平条形图
Stem 棉签图
Boxplot 绘制箱型图
Hist 绘制直方图
his2d 绘制2D直方图
Pie 绘制饼状图
Step 绘制阶梯图
Quiver 绘制一个二维按箭头
Stackplot 绘制堆叠图
Polar 绘制极坐标图

折线图

plot() 用于画图它可以绘制点和线,语法格式如下:

# 画单条线
plot([x], y, [fmt], *, data=None, **kwargs)

# 画多条线
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)

参数说明:

x, y:点或线的节点,x 为 x 轴数据,y 为 y 轴数据,数据可以列表或数组。x 轴是可选,不指定则以y轴长度为个数,生成从0开始的整数数组为x轴。

fmt:可选,定义基本格式(如颜色、标记和线条样式)。

**kwargs:可选,用在二维平面图上,设置指定属性,如标签,线的宽度等。

基础折线图:

import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [2,4,9,26]
plt.plot(x,y)
plt.show()

标签信息:

在画布中添加标签信息:

  • plt.xlabel(): x轴坐标信息
  • plt.ylabel(): y轴坐标信息
  • plt.title(): 顶部标题信息
import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [2,4,9,26]
plt.plot(x,y)
plt.xlabel("x")
plt.ylabel("y")
plt.title("title")
plt.show()

网格:

plt.grid(): 设置画布中显示网格线

import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [2,4,9,26]
plt.plot(x,y)
plt.xlabel("x")
plt.ylabel("y")
plt.title("title")
plt.grid()
plt.show()

点图:

设置fmt参数,绘制点图

import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [2,4,9,26]
plt.plot(x,y, "o")
plt.show()

柱状图

bar() 方法语法格式如下:

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

参数说明:

  • x:数组,柱形图的 x 轴数据。
  • height:数组,柱形图的高度。
  • width:浮点型数组,柱形图的宽度。
  • bottom:数组,底座的 y 坐标,默认 0。
  • align:柱形图与 x 坐标的对齐方式

    • ‘center’ 以 x 位置为中心,这是默认值。
    • ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=’edge’。
  • **kwargs::其他参数。

基础柱状图:

import matplotlib.pyplot as plt

x = ["apple", "banana", "origin", "watermelon"]
y = [12, 22, 6, 18]

plt.bar(x, y)
plt.show()

设置柱状图颜色:

import matplotlib.pyplot as plt

x = ["apple", "banana", "origin", "watermelon"]
y = [12, 22, 6, 18]

plt.bar(x, y, color="blue")
plt.show()

import matplotlib.pyplot as plt

x = ["apple", "banana", "origin", "watermelon"]
y = [12, 22, 6, 18]

plt.bar(x, y, color=["skyblue", "origin", "magenta", "cyan"])
plt.show()

柱状图填充

使用 hatch 参数可以指定柱状图填充形状, 取值包括:’/’, ‘\’, ‘|’, ‘-‘, ‘+’, ‘x’, ‘o’, ‘O’, ‘.’, ‘*’

import matplotlib.pyplot as plt

x = ["apple", "banana", "origin", "watermelon"]
y = [12, 22, 6, 18]

plt.bar(x, y, hatch="/")
plt.show()

设置数值

使用 plt.bar_label 函数给柱状图设置数值参数

import matplotlib.pyplot as plt

x = ["apple", "banana", "origin", "watermelon"]
y = [12, 22, 6, 18]

bar = plt.bar(x, y)
plt.bar_label(bar)
plt.show()

柱状对比图:

import matplotlib.pyplot as plt


y_1 = [0.1136, 1.4602, 0.3427, 1.8336]
y_2 = [0.2234, 1.2587, 0.4416, 1.8415]

#2、创建画布
plt.figure(figsize=(20,8))

plt.bar([i-0.1 for i in range(4)], y_1, width=0.2, label='before optimize')
plt.bar([i+0.1 for i in range(4)], y_2, width=0.2, label='after optimize')

#4、修改X刻度
plt.xticks([0,1,2,3], ['MSE', 'RMSE', 'MAE', 'R2'])

plt.legend()
plt.grid(True)
plt.title("model optimize compare")
plt.xlabel("metrics")
plt.ylabel("value")
plt.show()

饼图

pie 是饼图的函数,下面是函数接口:

pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)
  • x:浮点型数组或列表,用于绘制饼图的数据,表示每个扇形的面积。
  • labels:列表,各个扇形的标签,默认值为 None。
  • colors:数组,表示各个扇形的颜色,默认值为 None。

基础饼图:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([35, 25, 25, 15])

plt.pie(x)
plt.show()

标签和颜色:

labels:设置每一个饼图的标签,和饼图个数不一致会报错

colors:设置每一个饼图的颜色,和饼图个数不一致会报错

x = [35, 25, 25, 15]
label = ['apple', "banana", "orange", "watermelon"]
color=["skyblue", "pink", "teal", "cyan"]

plt.pie(x, labels=label, colors=color)
plt.show()

添加百分比:

autopct: 设置百分比,%0.1f%% 代表小数点后一位的带百分号的百分比

x = [35, 25, 25, 15]
label = ['apple', "banana", "orange", "watermelon"]
color=["skyblue", "pink", "teal", "cyan"]

plt.pie(x, labels=label, colors=color, autopct="%0.1f%%")
plt.show()

棉签图

import numpy as np

pred = np.array([0.5, 0.9, 0.23, 0.56, 0.8, 0.4, 0.5, 0.4, 0.7, 0.1, 0.9])
y_test = np.array([0.1, 0.2, 0.3, 0.8, 0.1, 0.2, 0.9, 0.1, 0.5, 0.3, 0.4])

diff = pred - y_test

plt.stem(list(range(len(diff))), diff, linefmt="-.")
plt.show()

箱线图

boxplot(箱线图,又称为盒须图、盒式图)是在1977年由美国统计学家John Tukey发明,分析数据需要为定量数据。通过箱线图,可以直观的探索数据特征,比如观察数据中是否存在异常数据,离群数据。

箱线图共由五个数值点构成,分别是最小观察值,25%分位数(Q1),中位数,75%分位数(Q3),最大观察值,

  • 最小观察值 = Q1 – 1.5(IQR), IQR = Q3 –Q1
  • 最大观察值 = Q3 + 1.5(IQR), IQR = Q3 –Q1

下图显示了箱型图与正态分布的概率分布函数的比较。

箱线图查看:

下极限(Min):数据集中最小的值。

下四分位数(Q1):数据的第25百分位数。

中位数(Q2):数据的第50百分位数。

上四分位数(Q3):数据的第75百分位数。

上极限(Max):数据集中最大的值。

注意:

上下限:上下限并不是整个数据样本的最大值和最小值,而是

  • 上限 = 去除异常值的最大值(Q3+1.5IQR)
  • 下限 = 去除异常值的最小值(Q1-1.5IQR)

在上下限这里分别划出两条线段作为异常值的分界点。

import numpy as np

arr = np.array([0.5, 0.9, 0.23, 0.56, 0.8, 0.4, 0.5, 0.4, 0.7, 0.1, 0.9])

plt.boxplot(arr)
plt.show()

存在异常值的数据:

import numpy as np

arr = np.array([2.5, 0.9, 0.23, 0.56, 0.8, 2.4, 0.5, 0.4, 0.7, 0.1, 0.9])

plt.boxplot(arr)
plt.show()

箱体填充:

import numpy as np

arr = np.array([0.5, 0.9, 0.23, 0.56, 0.8, 0.4, 0.5, 0.4, 0.7, 0.1, 0.9])

plt.boxplot(arr, patch_artist=True)
plt.show()

中位线样式:

import numpy as np

arr = np.array([0.5, 0.9, 0.23, 0.56, 0.8, 0.4, 0.5, 0.4, 0.7, 0.1, 0.9])

plt.boxplot(arr, patch_artist=True, medianprops={'linestyle': '-', 'color': 'y', 'linewidth': 1.5})
plt.show()