Advertisement

数据可视化的艺术:Matplotlib带你领略Python绘图之美(上)

阅读量:

文章一览

  • 前言
  • 一、数据可视化
  • 二、Matplotlib
    • 2.1 Matplotlib 架构

    • 2.2 画图方式

      • 2.2.1 plt.figure(): plt.*** 系列
      • 2.2.2 fig, ax = plt.subplots() 或 ax = plt.axes()
      • 2.2.3 plt.subplots 函数
      • 2.2.4 plt.axes 函数
      • 2.2.5 科学坐标图绘制
    • 2.3 plot()函数

      • 2.2.1 列表(list)类型转换成 numpy 类型
    • 2.4 添加更多元素

      • 2.3.1 设置图版大小
      • 2.3.2 图形保存
      • 2.3.3 调整坐标轴刻度
      • 2.3.4 设置坐标轴范围
      • 2.3.5 设置坐标轴标签
      • 2.3.6 给图形添加图例
      • 2.3.7 给图形添加文本
      • 2.3.8 设置中文显示
    • 2.5 处理图像

前言

在数据科学和机器学习领域,数据可视化是一个至关重要的步骤。它不仅帮助我们理解数据,还能揭示数据中隐藏的模式和趋势。Python,作为一种流行的编程语言,拥有众多强大的库来支持数据可视化,而Matplotlib就是其中最受欢迎和广泛使用的库之一。
Matplotlib是一个Python 2D绘图库,它能够生成高质量的图形。它提供了一个类似于MATLAB的绘图框架,使得用户可以很容易地创建图表、直方图、功率谱、条形图、错误图、散点图等。Matplotlib既可以用于简单的散点图,也可以用于复杂的3D图。

一、数据可视化

简单的说:数据可视化(Data Visualization )是将抽象的科学或者商业数据用图形、图像的方式表示出来。借助图形化手段,清晰有效地传达信息、帮助理解数据的意义

数据可视化与信息图形、信息可视化、科学可视化及统计图形密切相关

有研究表明,人的大脑只能记录三个场景。而 可视化 就是尽量用图形的方式把所有的数据集中在一个图像上,这样大脑就只需要记住一个场景以记忆和分析。

二、Matplotlib

matplotlib 是目前 Python 中强大的数据可视化工具包。是建立在 NumPy 数组基础上的多平台数据可视化程序库。可以方便地创建 2D、3D 图表

2.1 Matplotlib 架构

使用一个工具,首先要理解其设计的逻辑。Matplotlib 涉及的逻辑基本上和绘画的流程是一样的

  • 画板(Figure)
  • 画布(纸)
  • 调色、作画

Figure 代表一个绘制画板,画板可以包含多个 Axes/Subplot (即多个子图)。

使用 matplotlib 绘图的原理,主要就是理解 figure(画布)、axes(坐标系)、axis(坐标轴)三者之间的关系。

在 Matplotlib 中画图的步骤:

  • 先在画板准备一幅画布(Figure)
  • 给画布准备不同的区域,即坐标系(axes)。每一个axes 相当于画布上的一小块区域
  • 最后,在不同的区域(axes)内调色、作画。每一幅图都有自己的坐标轴(axis)

注意:创建画布 (figure) 有两种方式:隐式显示 创建

如果不设置 figure 对象,系统会自动创建一个 figure 对象,并且在这个 figure之上,自动创建一个 axes 坐标系。但只能绘制一个图形

figure 相当于画板。而 axes/subplot 则相当于铺在画板上的画布(画纸)

画布可以是 1 个或 1 个以上

用 matplotlib 里的 figure() 函数创建,程序中允许创建多个画图板,缺省条件下内部默认调用 figure(1)

画图的第一件事 ,就是创建一个 figure,然后在这个绘图板上加各种元素

复制代码
    import matplotlib.pyplot as plt  
    fig = plt.figure()  
    plt.show()
    
    
    python
    
    

缺省情况下,也可以直接在画板(figure)上作图

figure() 中允许创建多个画图板,缺省条件下内部默认调用 Figure1

plt.show()函数:没有这条语句就画不出图

:

复制代码
    import matplotlib.pyplot as plt  
    x = range(10)
    y = [15,14,26,26,15,18,19,8,21,22]
    fig = plt.figure()
    plt.plot(x, y)  
    plt.show()
    
    
    python
    
    

x 轴和 y 轴的坐标刻度是自动生成的,图片大小也是自动生成的

fig = plt.figure() 语句也可以省略

复制代码
    import numpy as np
    import matplotlib.pyplot as plt  
    x = np.array(range(10))
    y = x*x + 1
    plt.plot(x,y)
    plt.show()
    
    
    python
    
    

2.2 画图方式

在 matplotlib 中,有两种画图方式:

2.2.1 plt.figure(): plt.*** 系列

比如通过 plt.plot() 来画图。这是一个捷径。这个 plt 提供了很多基本的 function, 可以很快画出图来

2.2.2 fig, ax = plt.subplots() 或 ax = plt.axes()

这个也是常用的画图方法。指定 figure 和 axes,然后对 axes 单独操作

弄清了 Axes 和 Axis,那么如何作图、如何修改就基本搞清楚了。Matplotlib 一般标准画图的流程

  • 第一步,产生一幅图:fig = figure()
  • 第二步,建立坐标系:ax = fig.add_axes() 或 ax = plt.axes()
  • 第三步,画图:ax.plot()
  • 第四步,显示:plot.show()

Axes 是 Matplotlib API 中一个重要的类,是大多数对象进入的绘图区域

标准用法 :创建一个 Figure 实例,使用 Figure 来创建一个或多个 Axes 或 Subplot 实例,并使用 Axes 实例创建图元

2.2.3 plt.subplots 函数

plt.subplots 用于创建一个图形(figure)和一组子图/坐标系(axes)。该函数返回一个图形对象(figure)和一组子图对象(axes),通常分别保存在 fig 和 axes 变量中,然后用 axes 对象在其区域内进行绘图

  • nrows (int): 子图的行数,默认为1
  • ncols (int): 子图的列数,默认为1
  • figsize (tuple): 图形的尺寸,以英寸为单位
复制代码
    import matplotlib.pyplot as plt
    import numpy as np  
    # 创建一个1行2列的子图,图形尺寸为(12, 5)  
    fig, ax = plt.subplots(1, 2, figsize=(12, 5))  
    # 生成数据  
    x = np.random.rand(100)  
    y = np.random.rand(100)  
    categories = ['A', 'B', 'C', 'D']  
    values = [23, 45, 56, 78] 
    
    # 在第一个子图中绘制散点图  
    ax[0].scatter(x, y, color='blue', alpha=0.5)  
    ax[0].set_title('Scatter Plot')  
    ax[0].set_xlabel('x')  
    ax[0].set_ylabel('y')
    
    # 在第二个子图中绘制柱状图  
    ax[1].bar(categories, values, color='green')  
    ax[1].set_title('Bar Chart')  
    ax[1].set_xlabel('Categories')  
    ax[1].set_ylabel('Values')  
      
    # 显示图形  
    plt.show() 
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/zxrvIc7iayCTXR5J6Z3kjQunFpoq.png)


set_xlabel(), set_ylabel():设置 x 轴和 y 轴的标签

set_xlim(), set_ylim():设置当前 x,y 轴取值范围

set_title :设置图的标题

复制代码
    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot()
    plt.show()
    
    
    python
    
    

标准方式是 同时生成了 figure 和 axes 两个对象,然后用 ax 对象在其区域内进行绘图

复制代码
    import matplotlib.pyplot as plt
    f,ax = plt.subplots(2,2)
    ax[0][0].plot([1,2,3],'r-')  #第一个绘图区
    ax[0][1].plot([1,2,3],'ro')  #第二个绘图区
    ax[1][0].plot([1,2,3],'r--') #第三个绘图区
    ax[1][1].plot([1,2,3],'r+')  #第四个绘图区
    plt.show()
    
    
    python
    
    

2.2.4 plt.axes 函数

plt.axes() 函数用于创建一个新的子图(Axes)对象,并设置其在画板(Figure)中的位置和尺寸

复制代码
    plt.axes([left,bottom,width,height],**kwargs)
    
    
    python
    
    
  • [left, bottom, width, height](可选):一个包含四个元素的列表或元组,用于指定轴的位置和尺寸。这些值的范围是 [0, 1] ,表示相对于图形窗口的归一化单位
    • **kwargs(可选):用于设置轴的属性和特性。常用的关键字参数包括:
      • (1)facecolor:轴的背景颜色
      • (2)xlabel 和 ylabel:设置 x 轴和 y 轴的标签
      • (3)title:设置轴的标题
复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    # 生成子图
    ax = plt.axes()
    #ax = plt.axes(xlabel = 'x',ylabel = 'y')
    x = np.linspace(0, 10, 1000)
    # 在子图中绘画
    ax.plot(x, np.sin(x))  
    plt.show()
    
    
    python
    
    
复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    t = np.arange(0.0, 2.0, 0.01)
    s = 1 + np.sin(2 * np.pi * t)
    fig, ax = plt.subplots()
    ax.plot(t, s)
    ax.set(xlabel='time (s)', ylabel='voltage (mV)',
       title='About as simple as it gets')
    ax.grid()
    fig.savefig("test.png")
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/FvInQCejBXxWf8EAgMNmlYaHkwb4.png)
复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    x1 = np.linspace(0.0, 5.0)
    x2 = np.linspace(0.0, 2.0)
    y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
    y2 = np.cos(2 * np.pi * x2)
    fig, (ax1, ax2) = plt.subplots(2, 1)
    fig.suptitle('A tale of 2 subplots')
    ax1.plot(x1, y1, 'o-')
    ax1.set_ylabel('Damped oscillation')
    ax2.plot(x2, y2, '.-')
    ax2.set_xlabel('time (s)')
    ax2.set_ylabel('Undamped')
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/154PNZzok0HAyXq6Rd7UCYpQ2xhV.png)
复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    fig = plt.figure()
    fig.subplots_adjust(top=0.8)
    ax1 = fig.add_subplot(211)
    ax1.set_ylabel('volts')
    ax1.set_title('a sine wave')
    
    t = np.arange(0.0, 1.0, 0.01)
    s = np.sin(2*np.pi*t)
    line, = ax1.plot(t, s, color='blue', lw = 5)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/f2Emn7H6jJpaYKRLuUNZMqe9izSb.png)

2.2.5 科学坐标图绘制

复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    x = np.arange(0, 10, 0.2)
    y1 = np.sin(x)
    y2 = np.sin(x+0.2)
    #创建一个axes
    fig, ax = plt.subplots() 
    ax.plot(x, y1, label='y1')
    ax.plot(x, y2, label='y2')
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/3rV14e0GOxlg8CyMJ6kFwKW5QILD.png)
复制代码
    #展示图例 legend loc = 是用来定义图例的位置的
    ax.legend(loc = 'upper right')
    #定义标题
    ax.set_title('sin curve')
    #定义x, y轴的名称
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    #定义x,y轴的显示范围
    ax.set_xlim(0, 10)
    ax.set_ylim(-1,1)
    #打开网格
    ax.grid(True)
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/QuU0e86SRP7LXV2hH3oDfyYdNp4b.png)
复制代码
    # plot 定义线型
    ax.plot(x, y1, '-rv',label='y1')
    ax.plot(x, y2, '-bo',label='y2')
    
    
    python
    
    

2.3 plot()函数

功能:将 y 与 x 绘制为线条和/或标记,官方文档说明如下:

matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)

可调用的方法:

  • plot([x], y, [fmt], *, data=None, **kwargs)
  • plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs)

x , y – x 轴数据集合, y 轴数据集合

fmt:可选参数,定义基本格式 (如颜色(color)、标记(marker) 和 线型风格(linestyle)

data:具有标记数据的对象。如果给定, 需要提供在x和y中打印的标签名称

∗∗kwargs: 是 fmt 参数的扩展,用于指定诸如线条标签、线宽、抗锯齿、标记面颜色等属性

fmt:可选参数 ,是定义基本格式 (如颜色、标记和 linestyle) 的简便方法

fmt=′[color] [marker] [linestyle] ′

复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    x = np.linspace (-1,1,50)
    y = 2*x + 1  
    plt.figure()
    plt.plot(x, y)  
    plt.plot(x, y,'bo')
    plt.show()
    
    
    python
    
    

画更多条曲线:

复制代码
    import numpy as np
    import matplotlib.pyplot as plt 
    t = np.arange (0.,5.,0.2)
    plt.plot(t,t,'r--')
    plt.plot(t,t**2,'bs')
    plt.plot(t,t**3,'g^')
    plt.show()
    
    
    python
    
    

2.2.1 列表(list)类型转换成 numpy 类型

在数据可视化时,建议把 x,y 数据类型设置成数组类型,除非x,y都是列表类型

复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    x = [1,2,3,5]
    y = 2*x + 3  
    fig = plt.figure()
    plt.plot(x, y,'bo') 
    plt.show()
    # 转化为数组
    import numpy as np  
    import matplotlib.pyplot as plt
    x = [1,2,3,5]
    x = np.array(x)
    y = 2*x + 3  
    fig = plt.figure()
    plt.plot(x, y,'-') 
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/U7GWvl4ZSbtmRrX5nC2L6NVBheH1.png)

plot () 接收的多个 (x、y) 值要转换成 numpy 数组类型

把列表类型 x 转换成 numpy.ndarray 类型

2.4 添加更多元素

复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    x = np.linspace (-1,1,50)
    y = x**2 
    fig = plt.figure()
    plt.plot(x, y)  
    plt.show()
    
    
    python
    
    

对这张图需要做的更多:

  • 设置图板大小
  • 图形保存
  • 调整轴的刻度
  • 设置坐标轴范围
  • 设置坐标轴标签
  • 给图形添加图例
  • 给图形添加文字

2.3.1 设置图版大小

figure()函数: 设置绘图区域大小。函数格式:

plt.figure (num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)

所有参数都是可选的,都有默认值,因此调用该函数时可以不带任何参数

  • num: 如果为整数,则数字表示窗口的序号。如果为字符串,则表示窗口的名称
  • figsize: 设置窗口大小。指定窗口的宽度和高度,缺省值:[6.4, 4.8]
  • dpi:指定绘图对象的分辨率,即每英寸多少个像素,缺省值为 80
  • facecolor: 窗口的背景颜色
  • edgecolor: 窗口的边框颜色
复制代码
    import numpy as np
    import matplotlib.pyplot as plt  
    x = np.linspace (-1,1,50)
    y = x**2
    plt.figure(figsize=(10,8),dpi=80)
    plt.plot(x, y)
    plt.show()
    
    
    python
    
    

2.3.2 图形保存

图形保存:plt.savefig()

复制代码
    import numpy as np
    import matplotlib.pyplot as plt  
    x = np.linspace (-1,1,50)
    y = x**2
    plt.figure(figsize=(10,8),dpi=80)
    plt.plot(x, y)
    plt.savefig('test.png')  
    plt.show()
    
    
    python
    
    

2.3.3 调整坐标轴刻度

X 轴刻度:plt.xticks() Y 轴刻度:plt.yticks()

语法plt.xticks(ticks=None, labels=None, **kwargs)

  • ticks: x 轴刻度位置的列表/元组,若传入空列表,即不显示x轴
  • labels:放置在给定刻度位置的标签,仅当也传递了 ticks 时才能传递此参数
  • **kwargs:文本属性可用于控制标签的外观,如字体大小、字体样式等
复制代码
    import numpy as np
    import matplotlib.pyplot as plt  
    x = range(10)
    y = [15,14,26,26,15,18,19,8,21,22]
    plt.plot(x, y)
    plt.xticks(range(10))
    plt.yticks(range(min(y),max(y)+1,2))  
    plt.show()
    
    import numpy as np
    import matplotlib.pyplot as plt  
    x = [1, 2, 3, 4]
    y = [1, 4, 9, 6]
    labels = ['Frogs', 'Tiger', 'Pig', 'Sheep']
    plt.plot(x, y)
    plt.xticks(x, labels, rotation='45')
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/35wgV1zuse2flGn8I0JNKPQDSmFR.png)
复制代码
    import numpy as np
    import matplotlib.pyplot as plt  
    x = range(10)
    y = [15,14,26,26,15,18,19,8,21,22]
    plt.plot(x, y)
    x = list(x)[::3]
    xlab = ['a,{}'.format(i)for i in x]
    plt.xticks(x,xlab,rotation = 45,color = 'red')
    plt.yticks(range(min(y),max(y)+1,2))  
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/w90tUD2luYpfVCdrQE8nkBoqsi5J.png)

2.3.4 设置坐标轴范围

plt.xlim() 显示的是 x 轴的作图范围(即显示的最小值和最大值),确保只有指定范围内的数据会被展示出来。而 plt.xticks() 表达的是 x 轴的刻度位置和标签

调用格式:

plt.xlim(xmin, xmax)

  • xmin:x 轴上的最小值
  • xmax:x 轴上的最大值

plt.ylim() 显示的是 y 轴的作图范围

复制代码
    x = np.linspace (-2,2,50)
    y = x**2 
    plt.plot(x, y)
    plt.xlim(0,1)
    plt.ylim(0,1)
    plt.show()  
    
    
    python
    
    

2.3.5 设置坐标轴标签

为了设置坐标轴标签,采用:

复制代码
    matplotlib.pyplot.xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None,,**kwargs)
    
    
    python
    
    
复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    x = np.linspace (-1,1,50)
    y = x**2 fig = plt.figure()
    plt.plot(x, y)
    plt.xlabel('x axis',loc='left',color='red')
    plt.show()
    
    
    python
    
    

2.3.6 给图形添加图例

plt.legend() 函数用于在图表中添加图例。图例是帮助读者理解图表上不同线条或数据点代表的含义的小窗口

基本用法 :可以通过在 plot 函数中指定 label 参数来为每个数据集设置一个标签。然后调用 plt.legend() 函数将自动为您创建一个包含这些标签的图例

复制代码
    plt.legend(loc='upper left',title='Legend Title', frameon=True, shadow=True)
    
    
    python
    
    
  • loc:指定图例的位置。可以是一个字符串(如 ‘upper right’)或数字,默认值是’upper left’
    • title:为图例添加标题
    • frameon:控制是否显示图例外框,默认为 True
    • shadow:图例外框是否有阴影效果,默认为 False
复制代码
    import numpy as np
    import matplotlib.pyplot as plt 
    x = np.linspace (0, 10, 1000)
    y = np.sin (x)
    z = np.cos (x**2)
    plt.figure ()
    plt.plot (x,y, label = '$sin (x) $', color = 'red')
    plt.plot (x,z, 'b--', label = '$cos (x^2) $')
    plt.xlabel ('Time(s)')
    plt.ylabel ('Volt')
    plt.legend (loc = 'lower left')
    plt.show ()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/zQmlhiV4JnXaf83kuDsRH5opPMYW.png)

plt.legend() 和 plt.plot() 函数搭配使用

在 plt.plot() 函数参数里,其中一个参数 label 给曲线指定一个标签名称,此标签名称将在 plt.legend() 函数指定的位置参数 loc 中显示

如果标签字符串的前后有字符‘$’,matplotlib 使用其内嵌的 LaTex 引擎 将其显示为数学公式

2.3.7 给图形添加文本

plt.text()函数用于设置文字说明

plt.text(x, y, s, fontsize=None, **kwargs)

  • x,y:float,放置文本的坐标
  • s:显示的文本
  • fontsize:文本字体大小
  • **kwargs:文本属性
复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    x = np.linspace (-1,1,50)
    fig = plt.figure()
    plt.plot(x, x**2, 'r--', label = '$ x^2$')
    plt.legend(loc = 'upper center')
    plt.text(0.,0.6,'curve',fontsize = 20,color ='red',rotation = 45)
    plt.show()
    
    
    python
    
    

2.3.8 设置中文显示

matplotlib 默认不支持中文显示,使用系统字体,设置 plot 显示中文

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

复制代码
    import numpy as np  
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    x = np.linspace (-1,1,50)
    y = x**2 
    fig = plt.figure()
    plt.plot(x, y)
    plt.text(0.,0.6,'二次曲线')
    plt.show()
    
    
    python
    
    

2.5 处理图像

atplotlib 不仅通过把数据可视化以用来绘制各种图表。Matplotlib 还有一个 image 模块 ,提供了一些用于读取、写入和处理图像文件的工具

复制代码
    import matplotlib.image as mpimg
    
    import numpy as np  
    import matplotlib.pyplot as plt
    # 读取图像文件
    img = mpimg.imread('cat.png')
    # 显示图像
    plt.imshow(img) 
    plt.axis('off') 
    plt.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/krocuQgVnOYd5Ub1TZyR9zC2j07I.png)

plt.imshow(img)plt.show() 在 Matplotlib 库中经常搭配使用,主要是为了在 Python 中绘制图像并显示出来

全部评论 (0)

还没有任何评论哟~