数据可视化的艺术: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


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:设置轴的标题
- **kwargs(可选):用于设置轴的属性和特性。常用的关键字参数包括:
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


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


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


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


#展示图例 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


# 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

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


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


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


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

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