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里的用法一模一样。
标签:基本,plot,plt,import,matplotlib,ax2,Matplotlib,使用,inline From: https://www.cnblogs.com/-ula/p/18493761