机器学习中许多时候需要将数据可视化,方便更直观地表现目前的数据。
安装方法:
pip install matplotlib
matplotlib是一个庞大的绘图库模块。pyplot子模块可以完成许多图表绘制。
认识matplotlib.pyplot模块的主要函数
函数名称 | 说明 |
plot | 绘制折线图 |
scatter | 绘制散点图 |
hist | 绘制直方图 |
函数名称 | 说明 |
title(标题) | 设定坐标轴的标题 |
axis() | 可以设定坐标轴的最小和最大刻度范围 |
xlim(x_Min,x_Max) | 设定x轴的刻度范围 |
ylim(y_Min,y_Max) | 设定y轴的刻度范围 |
label(名称) | 设定图表标签图例 |
xlabel(名称) | 设定x轴的名称 |
ylabel(名称) | 设定y轴的名称 |
xticks(刻度值) | 设定x轴刻度值 |
yticks(刻度值) | 设定y轴刻度值 |
tick_params() | 设定坐标轴的刻度大小、颜色 |
legend() | 设定坐标的图例 |
text() | 在坐标轴指定位置输出字符串 |
grid() | 图表增加网格线 |
show() | 显示图表 |
cla() | 清除图表 |
函数名称 | 说明 |
imread(文件名) | 读取图片文件 |
savefig(文件名) | 将图片存入文件 |
绘制简单的折线图plot()
常用语法格式如下:
plot(x, y, lw=x, ls='x', label='xxx', color)
x:x轴系列值。
y:y轴系列值。
lw:linewidth的缩写,折线图的线条宽度。预设线条宽度是1,参数设定线条的粗细。
ls:linestyle的缩写,折线图的线条样式。
color:缩写是c,设置色彩。
label:图表的标签
画线基础实践
square[]列表有9笔数据代表y轴值,数据基本上是x轴索引0~8的平方值序列。
import matplotlib.pyplot as plt
x=[x for x in range(9)]
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(x,squares)
plt.show()
运行结果:
省略x轴数据
import matplotlib.pyplot as plt
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares)
plt.show()
运行结果如同上一个实例。
将x轴刻度设为0~8,y轴刻度设为0~70。
import matplotlib.pyplot as plt
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares)
plt.axis(0,8,0,70)
plt.show()
运行结果:
增加网络线
import matplotlib.pyplot as plt
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares)
plt.axis([0, 8, 0, 70])
plt.grid()
plt.show()
运行结果
线条宽度linewidth
设定线条宽度是10,使用lw=10。
import matplotlib.pyplot as plt
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares,lw=10)
plt.show()
运行结果
标题的显示
title(标题名称,fontsize=字号)
xlabel(标题名称,fontsize=字号)
ylabel(标题名称,fontsize=字号)
默认字号大小是12。
使用默认字号为图表与x、y轴建立标题。
import matplotlib.pyplot as plt
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares,lw=10)
plt.title('Test Chart')
plt.xlabel('Value')
plt.ylabel('Square')
plt.show()
运行结果:
使用设定字号24建立图标标题,字号16建立x、y轴标题。
import matplotlib.pyplot as plt
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares,lw=10)
plt.title('Test Chart',fontsize=24)
plt.xlabel('Value',fontsize=16)
plt.ylabel('Square',fontsize=16)
plt.show()
运行结果:
坐标轴刻度的设定
在设计图表时可以使用tick_params()设计设定坐标轴的刻度大小、颜色以及应用范围。
tick_paramas(axis='xx', labelsize=xx, color='xx')
如果axis的xx是both,代表应用到x轴和y轴;如果xx是x,代表应用到x轴;如果xx是y,代表应用到y轴;
使用不同刻度与颜色绘制图表。
import matplotlib.pyplot as plt
squares = [0, 1, 4, 9, 16, 25, 36, 49, 64]
plt.plot(squares, lw=10) # 列表squares数据是y轴的值, 线条宽度是10
plt.title('Test Chart', fontsize=24)
plt.xlabel('Value', fontsize=16)
plt.ylabel('Square', fontsize=16)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
运行结果:
多组数据的应用
plot(seq,第一组数据,seq,第二组数据,...)
设计含多组数据的图表。
import matplotlib.pyplot as plt
data1 = [1, 4, 9, 16, 25, 36, 49, 64] # data1线条
data2 = [1, 3, 6, 10, 15, 21, 28, 36] # data2线条
seq = [1,2,3,4,5,6,7,8]
plt.plot(seq, data1, seq, data2) # data1&2线条
plt.title("Test Chart", fontsize=24)
plt.xlabel("x-Value", fontsize=14)
plt.ylabel("y-Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
运行结果:
线条色彩与样式
色彩字符 | 色彩说明 |
'b' | blue(蓝色) |
'c' | cyan(青色) |
'g' | green(绿色) |
'k' | black(黑色) |
'm' | magenta(品红) |
'r' | red(红色) |
'w' | white(白色) |
'y' | yellow(黄色) |
字符 | 说明 |
‘-’或‘solid’ | 实线 |
‘--’或‘dashed’ | 虚线 |
‘-.’或‘dashdot’ | 虚点线 |
‘:’或‘dotted’ | 点线 |
‘.’ | 点标记 |
‘,’ | 像素标记 |
‘o’ | 圆标记 |
‘v’ | 反三角标记 |
‘^’ | 三角标记 |
‘<’ | 左三角形 |
‘>’ | 右三角形 |
‘s’ | 方形标记 |
‘p’ | 五角标记 |
‘*’ | 星星标记 |
‘+’ | 加号标记 |
‘-’ | 减号标记 |
‘x’ | X标记 |
‘H’ | 六边形1标记 |
‘h’ | 六边形2标记 |
上述可以混合使用,例如‘r-.’代表红色虚点线。
采用不同色彩与线条样式绘制图表
import matplotlib.pyplot as plt
data1 = [1, 2, 3, 4, 5, 6, 7, 8] # data1线条
data2 = [1, 4, 9, 16, 25, 36, 49, 64] # data2线条
data3 = [1, 3, 6, 10, 15, 21, 28, 36] # data3线条
data4 = [1, 7, 15, 26, 40, 57, 77, 100] # data4线条
seq = [1, 2, 3, 4, 5, 6, 7, 8]
plt.plot(seq, data1, 'g--', seq, data2, 'r-.', seq, data3, 'y:', seq, data4, 'k.')
plt.title("Test Chart", fontsize=24)
plt.xlabel("x-Value", fontsize=14)
plt.ylabel("y-Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
重新设计上图绘制线条 ,同时为各个点加上标记。
import matplotlib.pyplot as plt
data1 = [1, 2, 3, 4, 5, 6, 7, 8] # data1线条
data2 = [1, 4, 9, 16, 25, 36, 49, 64] # data2线条
data3 = [1, 3, 6, 10, 15, 21, 28, 36] # data3线条
data4 = [1, 7, 15, 26, 40, 57, 77, 100] # data4线条
seq = [1, 2, 3, 4, 5, 6, 7, 8]
plt.plot(seq, data1, '-*', seq, data2, '-o', seq, data3, '-^', seq, data4, '-s')
plt.title("Test Chart", fontsize=24)
plt.xlabel("x-Value", fontsize=14)
plt.ylabel("y-Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
刻度设计
假设3大品牌车辆2021-2023的销售数据如下:
import matplotlib.pyplot as plt
Benz = [3367, 4120, 5539] # Benz线条
BMW = [4000, 3590, 4423] # BMW线条
Lexus = [5200, 4930, 5350] # Lexus线条
seq = [2021, 2022, 2023] # 年度
plt.plot(seq, Benz, '-*', seq, BMW, '-o', seq, Lexus, '-^')
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
运行结果:
使用pyplot模块的xticks()、yticks()分别设置x、y轴刻度。
import matplotlib.pyplot as plt
Benz = [3367, 4120, 5539] # Benz线条
BMW = [4000, 3590, 4423] # BMW线条
Lexus = [5200, 4930, 5350] # Lexus线条
seq = [2021, 2022, 2023] # 年度
plt.xticks(seq) # 设定x轴刻度
plt.plot(seq, Benz, '-*', seq, BMW, '-o', seq, Lexus, '-^')
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
图例legend()
plot.plot()时需同时设置label。参数loc可以设置图例的位置。
'best':0
'upper right':1
'upper left‘:2
'lower left’:3
'lower right‘:4
'right':5(与'center right'相同)
'Center':6
'center right':7
'lower center‘:8
'upper center’:9
‘center':10
代码如下:
import matplotlib.pyplot as plt
Benz = [3367, 4120, 5539] # Benz线条
BMW = [4000, 3590, 4423] # BMW线条
Lexus = [5200, 4930, 5350] # Lexus线条
seq = [2021, 2022, 2023] # 年度
plt.xticks(seq) # 设定x轴刻度
plt.plot(seq, Benz, '-*', label='Benz')
plt.plot(seq, BMW, '-o', label='BMW')
plt.plot(seq, Lexus, '-^', label='Lexus')
plt.legend(loc='best')
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
运行结果如下:
保存与开启文件
图表设计完成,可以使用savefig()保存文件,这 个方法需放在show()的前方,表示 先储存再显示图表。
代码如下:
import matplotlib.pyplot as plt
Benz = [3367, 4120, 5539] # Benz线条
BMW = [4000, 3590, 4423] # BMW线条
Lexus = [5200, 4930, 5350] # Lexus线条
seq = [2021, 2022, 2023] # 年度
plt.xticks(seq) # 设定x轴刻度
plt.plot(seq, Benz, '-*', label='Benz')
plt.plot(seq, BMW, '-o', label='BMW')
plt.plot(seq, Lexus, '-^', label='Lexus')
plt.legend(loc='best')
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.savefig('out1_14.jpg', bbox_inches='tight')
plt.show()
plt.savefig()中第一个参数是所存的文件名,第二个参数是将图表外多余的空间删除。
要开启文件可以使用matplotlib.image模块。
代码如下:
import matplotlib.pyplot as plt
import matplotlib.image as img
fig = img.imread('out1_14.jpg')
plt.imshow(fig)
plt.show()
在图上标记文件
在绘制图表过程中,有时需要在图上标记文字,这时可以使用text()函数,此函数基本格式如下:
text(x,y,'文件符串')
x,y是文字输出的左下角坐标,它不是绝对坐标,是相对坐标,大小会随着坐标刻度增减。
代码如下:
import matplotlib.pyplot as plt
squares = [0, 1, 4, 9, 16, 25, 36, 49, 64]
plt.plot(squares) # 列表squares数据是y轴的值
plt.axis([0, 8, 0, 70]) # x轴刻度0-8, y轴刻度0-70
plt.text(2, 30, 'Deepen your mind')
plt.grid()
plt.show()
运行结果:
绘制散点图scatter()
基本散点图的绘制
绘制散点图可以使用scatter(),基本语法如下:
scatter(x, y, s, c, cmap)
x,y:在(x,y)位置绘图 c:颜色
s:绘图点的大小,预设是20。 cmap:彩色图表
在坐标轴(5,5)绘制一个点。
import matplotlib.pyplot as plt
plt.scatter(5, 5)
plt.show()
运行结果:
绘制系列点
代码如下:
import matplotlib.pyplot as plt
xpt = [1,2,3,4,5]
ypt = [1,4,9,16,25]
plt.scatter(xpt, ypt)
plt.show()
运行结果如下:
绘制黄色的系列点,这个系列点有100点,x轴的点由rang(1,100)产生,相对应y轴的值 则是x的平方值 。
代码如下:
import matplotlib.pyplot as plt
xpt = list(range(1,101)) # 建立1-100序列x坐标点
ypt = [x**2 for x in xpt] # 以x平方方式建立y坐标点
plt.scatter(xpt, ypt, color='y')
plt.show()
运行结果如下:
设定绘图区间
使用axis()设定绘图区间,语法格式如下:
axis([xmin, xmax, ymin, ymax]) #分别 代表x轴和y轴的最小和最大的区间
设定绘图区间为[0,100,0,10000]的应用。
import matplotlib.pyplot as plt
xpt = list(range(1,101)) # 建立1-100序列x坐标点
ypt = [x**2 for x in xpt] # 以x平方方式建立y坐标点
plt.axis([0, 100, 0, 10000]) # 留意参数是列表
plt.scatter(xpt, ypt, color=(0, 1, 0)) # 绿色
plt.show()
运行结果如下:
numpy模块
numpy是Python的一个扩充模块,可以支持多维度空间的数组与矩阵运算。
导入numpy模块,如下所示:
import numpy as np
建立一个简单的数组linspace()和arange()
在numpy模块中最基本的就是linspace()方法,使用它可以方便地产生等矩的数组,它的语法如下:
linspace(start,end,num)
start是起始值,end是结束值,num是设定产生多少个等距点的数组值,num的默认值是50。
arange()的语法如下:
arange(start, stop, step)
start是起始值,如果省略默认值是0。stop是结束值,但是所产生的数组不包含此值。step是数组相邻元素的间距,如果省略默认值是1。
建立0,1,……,9,10的数组。
import numpy as np
x1 = np.linspace(0, 10, num=11) # 使用linspace()产生数组
print(type(x1), x1)
x2 = np.arange(0,11,1) # 使用arange()产生数组
print(type(x2), x2)
x3 = np.arange(11) # 简化语法产生数组
print(type(x3), x3)
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
<class 'numpy.ndarray'> [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
<class 'numpy.ndarray'> [ 0 1 2 3 4 5 6 7 8 9 10]
<class 'numpy.ndarray'> [ 0 1 2 3 4 5 6 7 8 9 10]
[Done] exited with code=0 in 2.785 seconds
绘制波形
单纯给点为可以使用scatter()方法,此方法使用格式如下:
scatter(x, y, market='.',c(或color)='颜色') #market如果省略会使用预设
绘制sin()和con()的波形,调用plt.scatter()方法2次,相当于绘制2次波形图表。
import matplotlib.pyplot as plt
import numpy as np
xpt = np.linspace(0, 10, 500) # 建立含500个元素的数组
ypt1 = np.sin(xpt) # y数组的变化
ypt2 = np.cos(xpt)
plt.scatter(xpt, ypt1, color=(0, 1, 0)) # 绿色
plt.scatter(xpt, ypt2) # 预设颜色
plt.show()
运行结果如下:
使用系统默认颜色,绘制不同波形的应用。
import matplotlib.pyplot as plt
import numpy as np
left = -2 * np.pi
right = 2 * np.pi
x = np.linspace(left, right, 100)
f1 = 2 * np.sin(x) # y数组的变化
f2 = np.sin(2*x)
f3 = 0.5 * np.sin(x)
plt.plot(x, f1)
plt.plot(x, f2)
plt.plot(x, f3)
plt.show()
运行结果如下:
建立不等宽度的散点图
代码如下:
import matplotlib.pyplot as plt
import numpy as np
xpt = np.linspace(0, 5, 500) # 建立含500个元素的数组
ypt = 1 - 0.5*np.abs(xpt-2) # y数组的变化
lwidths = (1+xpt)**2 # 宽度数组
plt.scatter(xpt, ypt, s=lwidths, color=(0, 1, 0)) # 绿色
plt.show()
运行结果如下:
填满区间
在绘制波形时,如要填满区间,此时可以使用matplotlib模块的fill_between()方法,基本语法如下:
fill_bwtween(x,y1,y2,color,alpha,options, ...) #options是其他设置。
上述会填满所有相对x轴数列y1至y2的区间,如果不指定填满颜色,则会使用预设的线条颜色填满,通常填满颜色 会用较淡的颜色,所以可以设置alpha参数将颜色调谈
填满区间0~y,所使用的y轴值是函数式sin(3x)。
import matplotlib.pyplot as plt
import numpy as np
left = -np.pi
right = np.pi
x = np.linspace(left, right, 100)
y = np.sin(3*x) # y数组的变化
plt.plot(x, y)
plt.fill_between(x, 0, y, color='green', alpha=0.1)
plt.show()
运行结果如下:
填满区间-1~y,所使用的y轴值是函数式sin(3x)。
import matplotlib.pyplot as plt
import numpy as np
left = -np.pi
right = np.pi
x = np.linspace(left, right, 100)
y = np.sin(3*x) # y数组的变化
plt.plot(x, y)
plt.fill_between(x, -1, y, color='yellow', alpha=0.3)
plt.show()
运行结果如下:
色彩映射
camp,color map,指定使用哪一种色彩映射值。
色彩映射的应用。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t, cmap='rainbow')
plt.show()
运行结果:
设置固定点的宽度为50,将色彩改为依y轴值变化,同时使用hsv色彩映射表。
import matplotlib.pyplot as plt
import numpy as np
xpt = np.linspace(0, 5, 500) # 建立含500个元素的数组
ypt = 1 - 0.5*np.abs(xpt-2) # y数组的变化
plt.scatter(xpt, ypt, s=50, c=ypt, cmap='hsv') # 色彩随y轴值变化
plt.show()
运行结果:
将色彩改为依x轴值变化
import matplotlib.pyplot as plt
import numpy as np
xpt = np.linspace(0, 5, 500) # 建立含500个元素的数组
ypt = 1 - 0.5*np.abs(xpt-2) # y数组的变化
plt.scatter(xpt, ypt, s=50, c=xpt, cmap='hsv') # 色彩随x轴值变化
plt.show()
运行结果:
colormap绘制数组数据。
imshow(img. cmap='xx')
参数img可以图片,也可以数组数据。
绘制矩形数组数据。
import matplotlib.pyplot as plt
import numpy as np
img = np.array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9 , 10, 11],
[12, 13, 14, 15]])
plt.imshow(img, cmap='Blues')
plt.colorbar()
plt.show()
运行结果:
图表显示中文
以中文显示报表:
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 使用黑体
Benz = [3367, 4120, 5539] # Benz线条
BMW = [4000, 3590, 4423] # BMW线条
Lexus = [5200, 4930, 5350] # Lexus线条
seq = [2021, 2022, 2023] # 年度
plt.xticks(seq) # 设定x轴刻度
plt.plot(seq, Benz, '-*', label='Benz')
plt.plot(seq, BMW, '-o', label='BMW')
plt.plot(seq, Lexus, '-^', label='Lexus')
plt.legend(loc='best')
plt.title(u"销售报表", fontsize=24)
plt.xlabel(u"年度", fontsize=14)
plt.ylabel(u"销售量", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()
运行结果如下: