Matplotlib库的基本使用
1. 什么是Matplotlib
- Matplotlib是一款用于数据可视化的Python第三方库;
- 它能够根据NumPy数组来绘制2D图像。
2. 绘图基础
Matplotlib库太大,画图通常只需要其中的核心模块:matplotlib.pyplot
即可,并给一个别名,即:import matplotlib.pyplot as plt
。
2.1 绘制图像
import matplotlib.pyplot as plt # 绘制图像 Fig1 = plt.figure() # 创建新图窗 x = [1,2,3,4,5] # 数据的x值 y = [1,8,27,64,125] # 数据的y值 plt.plot(x,y) # plot函数:先描点,再连线
我们可以让界面展示SVG高清矢量图:
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 绘制图像 Fig1 = plt.figure() # 创建新图窗 x = [1,2,3,4,5] # 数据的x值 y = [1,8,27,64,125] # 数据的y值 plt.plot(x,y) # plot函数:先描点,再连线
2.2 保存图像
保存图像用.savefig()
方法,其需要一个r字符串:r'绝对路径\图像名.后缀'
。
- 绝对路径:即从盘符开始的完整路径;
- 后缀:可保存图形的格式很多,包括:eps、jpg、pdf、png、ps、svg等。
为了保存清晰的图,推荐保存至svg矢量格式:
Fig1.savefig(r'C:\Users\L\Desktop\我的图.svg')
保存为svg格式后,可直接拖至word或visio中,即可显式高清矢量图。
2.3 两种画图方式
Matplotlib中有两种画图方式:Matlab方式(推荐)和面向对象方式。
两种方式大部分情况下是一样的,且可以相互转化,个别情况有区别。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y = [1,8,27,64,125] # Matlab方式 Fig1 = plt.figure() plt.plot(x,y) # 面向对象方式 Fig2 = plt.figure() ax2 = plt.axes() ax2.plot(x,y)
对于面向对象方式,其实就是先创建图窗,再创建坐标轴。
2.4 图窗与坐标轴
对于图窗:
图像窗口(figure)在Matlab中会单独弹出,该窗口可容纳元素,也可以是空的窗口。在Jupyter中,可以不写plt.figure()
也可以看到窗口,但这不是个好习惯。我们在画图前仍然要手动创建窗口,毕竟保存图形的.savefig()
方法需要图形对象来调用。
对于坐标轴:
坐标轴(axes)是一个矩形,其下方是x轴的数值与刻度,左侧是y轴的数值与刻度。
3. 多图形的绘制
注意:我们经常使用Jupyter来画图,必须保证图形的图窗创建与画完必须在一个代码块中,不可以分成多个代码块。
3.1 绘制多线条
绘制多线条时,两种方式差别不大:
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y1 =[1,2,3,4,5] y2 = [0,0,0,0,0] y3 = [-1,-2,-3,-4,-5] # Matlab方式 Fig1 = plt.figure() plt.plot(x,y1) plt.plot(x,y2) plt.plot(x,y3) # 面向对象方式 Fig2 = plt.figure() ax2 = plt.axes() ax2.plot(x,y1) ax2.plot(x,y2) ax2.plot(x,y3)
3.2 绘制多子图
绘制多个子图时,两种方法差别比较大:
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y1 =[1,2,3,4,5] y2 = [0,0,0,0,0] y3 = [-1,-2,-3,-4,-5] # Matlab方式 Fig1 = plt.figure() plt.subplot(3, 1, 1), plt.plot(x,y1) # 表示3个子图按照3行1列方式排,该图是第一个 plt.subplot(3, 1, 2), plt.plot(x,y2) # 表示3个子图按照3行1列方式排,该图是第二个 plt.subplot(3, 1, 3), plt.plot(x,y3) # 面向对象方式 Fig2, ax2 = plt.subplots(3) ax2[0].plot(x,y1) ax2[1].plot(x,y2) ax2[2].plot(x,y3)
对于面向对象的方式我们发现Fig2, ax2 = plt.subplots(3)
代替了之前的两行代码,所以我们得出结论:以后用面向对象的方式创建图形时,可以直接写Fig2, ax2 = plt.subplots()
。
4. 图表类型
4.1 图表类型
plt提供5类基本图表,分别是:二维图(重点)、网格图(重点)、统计图(重点)、轮廓图(用不到)、三维图。
可以查看官方:Pairwise data — Matplotlib 3.9.2 documentation
二维图:只需要两个向量即可绘图,其中线型图可以替代其它所有二维图。
网格图:只需要一个矩阵即可绘图。
统计图:一般做数据分析时使用。
如果需要更多图,可以去官方查看挑选:Examples — Matplotlib 3.9.2 documentation
教程:Tutorials — Matplotlib 3.9.2 documentation
4.2 二维图
只讲解plot线型图函数,其它所有二维图都可用它替代。
4.2.1 设置颜色
plot()
函数含color参数,可以设置线条的颜色。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y1 =[1,2,3,4,5] y2 = [0,0,0,0,0] y3 = [-1,-2,-3,-4,-5] # Matlab方式和面向对象方式无差别 Fig1 = plt.figure() plt.plot(x, y1, color='#7CB5EC') plt.plot(x, y2, color='#F7A35C') plt.plot(x, y3, color='#A2A2D0') plt.plot(x, y4, color='#F6675D') plt.plot(x, y5, color='#47ADC7') # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.plot(x, y1, color='#7CB5EC') ax2.plot(x, y2, color='#F7A35C') ax2.plot(x, y3, color='#A2A2D0') ax2.plot(x, y4, color='#F6675D') ax2.plot(x, y5, color='#47ADC7')
颜色是以十六进制存储的。
4.2.2 设置风格
plot()
函数含有linestyle参数,可以设置线条的风格。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y1 =[1,2,3,4,5] y2 = [0,0,0,0,0] y3 = [-1,-2,-3,-4,-5] # Matlab方式和面向对象方式无差别 Fig1 = plt.figure() plt.plot(x, y1, linestyle='-') plt.plot(x, y2, linestyle='--') plt.plot(x, y3, linestyle='-.') plt.plot(x, y4, linestyle=':') plt.plot(x, y5, linestyle=' ') # 注意这里有个隐藏线段,很有用,不要忽视
4.2.3 设置粗细
plot()
函数含有linewidth参数,可以设置线条的粗细。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y1 =[1,2,3,4,5] y2 = [0,0,0,0,0] y3 = [-1,-2,-3,-4,-5] # Matlab方式和面向对象方式无差别 Fig1 = plt.figure() plt.plot(x, y1, linewidth=0.5) plt.plot(x, y2, linewidth=1) plt.plot(x, y3, linewidth=1.5) plt.plot(x, y4, linewidth=2)
在设置线条粗细时,数字表示磅数,一般以0.5到3为宜。
4.2.4 设置标记
plot()
函数含有marker参数,可以设置线条标记。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y1 =[1,2,3,4,5] y2 = [0,0,0,0,0] y3 = [-1,-2,-3,-4,-5] # Matlab方式和面向对象方式无差别 Fig1 = plt.figure() plt.plot(x, y1, marker='.') plt.plot(x, y2, marker='o') plt.plot(x, y3, marker='^') plt.plot(x, y4, marker='s') plt.plot(x, y5, marker='D')
标记可以调整吃寸,用markersize参数调整,其值以3到9为宜。
4.2.5 综合应用
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [1,2,3,4,5] y1 =[1,2,3,4,5] y2 = [0,0,0,0,0] y3 = [-1,-2,-3,-4,-5] # Matlab方式和面向对象方式无差别 Fig1 = plt.figure() plt.plot(x, y1, color='#7CB5EC', linestyle='-', linewidth=2, marker='o', markersize=6) plt.plot(x, y2, color='#F7A35C', linestyle='--', linewidth=2, marker='^', markersize=6) plt.plot(x, y3, color='#A2A2D0', linestyle='-.', linewidth=2, marker='s', markersize=6) plt.plot(x, y4, color='#F6675D', linestyle=':', linewidth=2, marker='D', markersize=6) plt.plot(x, y5, color='#47ADC7', linestyle=' ', linewidth=2, marker='o', markersize=6)
请注意y5的线条,此时为散点图,这种方式的散点图比plt.scatter()
效率更高,更推荐。
4.3 网格图
只演示imshow
函数,别的基本不用。
注意:面向对象的方式创建网格图会少很多功能,所以建议使用Matlab方式创建。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 import numpy as np x = np.linspace(0,10,1000) I = np.sin(x) * np.cos(x).reshape(-1,1) # Matlab 方式 Fig1 = plt.figure() plt.imshow(I)
在网格图中还可以配置颜色条,使用plt.colorbar()
。
Fig1 = plt.figure() plt.imshow(I) plt.colorbar()
4.4 统计图
只演示直方图hist
函数,因为其它函数主要出现在数据分析领域。
直方图和条形图的区别:
- 条形图:可以用plot替代,主要说的是某一种特征不同情况下的数量多少,看不出平均值和标准差;
- 直方图:统计学函数图,只为了看清某分布的均值和标准差。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 创建 10000 个标准正态分布的样本 import numpy as np data = np.random.randn( 10000 ) # Matlab方式 Fig1 = plt.figure() plt.hist( data ) # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.hist( data )
对该直方图求积分,结果就是个体的总数:10000。
4.4.1 区间个数
bins
参数即区间划分的数量,默认为10。
# Matlab 方式 Fig1 = plt.figure() plt.hist( data, bins = 30 ) # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.hist( data, bins = 30 )
4.4.2 透明度
Alpha
参数表示透明度,默认为1。
# Matlab 方式 Fig1 = plt.figure() plt.hist( data, alpha=0.5 ) # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.hist( data, alpha=0.5 )
4.4.3 图表类型
histtype
表示类型,默认为'bar'
。可以将其改为'stepfilled'
,图形就没有夹缝了,像一体的一样。
# Matlab 方式 Fig1 = plt.figure() plt.hist( data, histtype='stepfilled') # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.hist( data, histtype='stepfilled' )
4.4.4 直方图颜色
color
表示直方图颜色。
# Matlab 方式 Fig1 = plt.figure() plt.hist( data, color='#A2A2D0' ) # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.hist( data, color='#A2A2D0' )
4.4.5 边缘颜色
edgecolor
表示直方图边缘的颜色。
# Matlab 方式 Fig1 = plt.figure() plt.hist( data, edgecolor='#FFFFFF ) # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.hist( data, edgecolor='#FFFFFF' )
4.4.6 综合应用
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 创建三个正态分布的样本 import numpy as np x1 = np.random.normal( 3, 1, 1000 ) x2 = np.random.normal( 6, 1, 1000 ) x3 = np.random.normal( 9, 1, 1000 ) # Matlab 方式 Fig1 = plt.figure() plt.hist( x1, bins=30, alpha=0.5, color='#7CB5EC', edgecolor='#FFFFFF' ) plt.hist( x2, bins=30, alpha=0.5, color='#A2A2D0', edgecolor='#FFFFFF' ) plt.hist( x3, bins=30, alpha=0.5, color='#47ADC7', edgecolor='#FFFFFF' ) # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.hist( x1, bins=30, alpha=0.5, histtype='stepfilled', color='#7CB5EC' ) ax2.hist( x2, bins=30, alpha=0.5, histtype='stepfilled', color='#A2A2D0' ) ax2.hist( x3, bins=30, alpha=0.5, histtype='stepfilled', color='#47ADC7' )
5. 图窗属性
5.1 坐标轴上下限
尽管Matplotlib会自动调整图窗为最佳的坐标轴上下限,但有时候我们需要自己设置。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值 y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值
有两种方法设置坐标轴上下限:lim
和axis
。
5.1.1 lim
使用lim时,Matlab方式和面向对象方式出现区别:
- Matlab:
plt.xlim(x下限, x上限)
和plt.ylim(y下限, y上限)
- 面向对象:
ax.set_xlim(x下限, x上限)
和ax.set_ylim(y下限, y上限)
# Matlab 方式(lim 法) Fig1 = plt.figure() plt.plot(x,y) plt.xlim(1,5) plt.ylim(1,125) # 面向对象方式(lim 法) Fig2, ax2 = plt.subplots() ax2.plot(x,y) ax2.set_xlim(1,5) ax2.set_ylim(1,125)
5.1.2 axis
.axis([x下限, x上限, y下限, y上限])
# Matlab 方式(axis 法) Fig5 = plt.figure() plt.plot(x,y) plt.axis([1, 5, 1, 125]) # 面向对象方式(axis 法) Fig6, ax6 = plt.subplots() ax6.plot(x,y) ax4.axis([1, 5, 1, 125])
还可以使用plt.axis('equal')
使x轴与y轴的比例达到1:1等长。
5.2 标题与轴名
此处,两种创建方式又出现区别:
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值 y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值 # Matlab 方式 Fig1 = plt.figure() plt.plot(x,y) plt.title('This is the title.') plt.xlabel('This is the xlabel') plt.ylabel('This is the ylabel') # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.plot(x,y) ax2.set_title('This is the title.') ax2.set_xlabel('This is the xlabel') ax2.set_ylabel('This is the ylabel')
5.3 创建方式的区别
面向对象的方式和Matlab的方式有5种区别:
ax.set_xlim()
对应plt.xlim()
ax.set_ylim()
对应plt.ylim()
ax.set_title()
对应plt.title()
ax.set_xlabel()
对应plt.xlabel()
ax.set_ylabel()
对应plt.ylabel()
为了统一,面向对象整合了这5个函数,结合成了一个,即:ax.set(xlim=(), ylim=(), title='', xlabel='', ylabel='')
。
5.4 图例
.legend()
函数表示图例,一般图例会出现在二维图和统计图中,网格图则用颜色条代替图例。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值 y1 = [ 1, 2, 3, 4, 5 ] # 数据的 y1 值 y2 = [ 0, 0, 0, 0, 0 ] # 数据的 y2 值 y3 = [ -1, -2, -3, -4, -5 ] # 数据的 y3 值 # Matlab 方式 Fig1 = plt.figure() plt.plot(x, y1, label='y=x') plt.plot(x, y2, label='y=0') plt.plot(x, y3, label='y=-x') plt.legend() # 面向对象方式 Fig2, ax2 = plt.subplots() ax2.plot(x ,y1, label='y=x') ax2.plot(x ,y2, label='y=0') ax2.plot(x ,y3, label='y=-x') ax2.legend()
若有些线条的图例你不想展示,去掉函数中的label
关键字即可。
legend还有三个常用的关键字参数:loc
、frameon
和ncol
。
- loc用于表示图例位置,它的值分为两个位置值,一个在
upper
、center
、lower
中任选一个,一个在left
、center
、right
中任选一个,如:loc = 'upper right'
表示图例显示在右上角。- 也可以用
loc = 'best'
,会自动给你配置到最佳位置。
- 也可以用
- framon用于表示图例边框,不需要边框用:
frameon = False
。 - ncol用于表示图例的列数,默认是1列。
5.5 网格
.grid()
表示网格,可以给图形加网格。
import matplotlib.pyplot as plt # 展示高清图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats('svg') # 准备数据 x = [ 1, 2, 3, 4, 5 ] # 数据的 x 值 y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值 # Matlab 方式 Fig1 = plt.figure() plt.plot(x, y) plt.grid()
网格也有美化,有两个参数color和linestyle,与plot里的用法一模一样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)