Matplotlib绘图可视化
简单介绍
Matplotlib旨在用Python实现MATLAB的功能,是python最出色的绘图库,功能很完善,同时也继承了python的简单明了的风格。
安装Matplotlib之前先要安装Numpy。Matplotlib是开源工具,可以从link免费下载。该链接中包含了非常详尽的使用说明和教程。
Matplotlib.pyplot模块
Matplotlib的pyplot子库提供了和MATLAB类似的绘图API,方便用户快速绘制2D图表。Matplotlib还提供了一个名为pylab的模块,其中包含了许多Numpy和pyplot模块中常用的函数,方便用户快速进行计算和绘图。
一个例子:
from cProfile import label
import matplotlib
import matplotlib.pyplot as plt
# import math
import numpy as np
plt.figure(figsize=(8, 4)) # 创建一个绘图对象,大小为800像素
x_values = np.arange(0.0, np.pi * 4, 0.01) # 步长0.01,初始值为0.0,终值为4π
y_values = np.sin(x_values)
plt.plot(x_values, y_values, 'b--', label('$sin(x)$'), linewidth=1.0) # 进行绘图
plt.xlabel('x') #设置x轴的文字
plt.ylabel('sin(x)') # 设置Y轴的文字
plt.ylim(-1, 1) # 设置Y轴的范围
plt.title('Simple plot') # 设置图表的标题
plt.legend() # 显示图例
plt.grid(True)
plt.savefig("sin.png")
plt.show()
一、快速绘图
1、调用figure()创建一个绘图对象
plt.figure(figsize=(8, 4), dpi=100)
调用figure可以创建一个绘图对象,也可以不创建绘图对象直接调用plot()函数绘图,Matplotlib会自动创建一个绘图对象。
如果需要同时绘制多幅图表,则可以给figure()传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在,则不创建新的对象,而只是让它成为当前绘图对象。
figsize参数指定绘图对象的宽度和高度,单位为英寸,dpi参数指定绘图对象的分辨率,即每英寸多少像素,默认值为100。
这个dpi参数可以通过如下语句进行查看:
a = matplotlib.rcParams["figure.dpi"]
print(a)
2、通过调用plot()函数在当前的绘图对象中进行绘图
创建Figure对象之后,接下来调用plot()在当前的Figure对象中绘图。实际上plot()总是在Axes(子图)对象上绘图,如果当前的Figure对象中没有Axes对象,将会为之创建一个几乎充满整个图标的Axes的对象,并且使此Axes对象成为当前的Axes对象。
x_values = np.arange(0.0, np.pi * 4, 0.01)
y_values = np.sin(x_values)
plt.plot(x_values, y_values, 'b--', linewidth=1.0, label="sin(x)
通过第3个参数“b–”指定曲线的颜色和线型。这个参数称为格式化参数。他能够通过一些易记的符号快速指定曲线的样式。其中,b表示蓝色,“–”表示线型为虚线。
常用作图参数如下:
(1)颜色(color简写为c)
蓝色:‘b’(blue);
绿色:‘g’(green);
红色:‘r’(red);
蓝绿色(墨绿色):‘c’(cyan);
红紫色(洋红):‘m’(magenta);
黄色:‘y’(yellow);
黑色:‘k’(black);
白色:‘w’(white);
灰度表示:0.75([0,1]内任意浮点数)
RGB表示法:(0.18,0.31,0.31)
(2)线性(简写为ls)
实线:‘-’
虚线:’–’
虚点线‘-.’
点线:’:’
点:’.’
星型:‘*’
(3)线宽:浮点数(float)
y_values = []
x_values = []
num = 0.0
while num < math.pi*4:
y_values.append(math.sin(num))
x_values.append(num)
num += 0.1
plt.plot(x_values, y_values, 'r*')
plt.show()
也用关键字参数指定各种属性。label:给所绘制的曲线一个名字,此名字在图例(legend)中显示。只要在字符串前后添加“$”符号,Matplotlib就会使用其内嵌的latex绘制的数学公式。color指定曲线的颜色;linewidth指定曲线的宽度。
3、设置绘图对象的各个属性
xlabel,ylabel:分别设置x轴和y轴的标题文字;
title:设置图的标题;
xlim,ylim:分别设置x轴,y轴的显示范围;
legend():显示图例,即图中表示每条曲线的标签(label)和样式的矩形区域。
plt.plot(x_values, y_values, 'r*')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.ylim(-1, 1)
plt.title('Simple plot')
plt.legend()
plt.show()
pyplot模块提供了一组读取和显示相关的函数,用于在绘图区域中增加显示内容及读入数据。
函数 | 功能 |
---|---|
plt.legend() | 在绘图区域中放置绘图标签 |
plt.show() | 显示创建的绘图对象 |
plt.matshow() | 在窗口显示数组矩阵 |
plt.imsave() | 保存数组为图像文件 |
plt.imread() | 从图像文件中读取数组 |
4、清空plt绘制的内容
plt.cla()
plt.close(0)
plt.close('all')
5、图形保存和输出设置
可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。
plt.savefig("test.png", dpi=120)
6、绘制多子图
可以使用subplot()快速绘制包含多个子图的图表
subplot(numRows, numCols, plotNum)
subplot函数将整个绘图区域等分为numRows行*numCols列个子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上的区域编号为1,plotNum指定使用第几个子区域。
如果numRows,numCols和plotNum这三个数都小于10,则可以把它们缩写为一个整数。例如:subplot(324),subplot(3,2,4)是相同的。
subplot函数会在参数plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠,则之前的轴将会被删除。
通过axisbg参数给每个轴设置不同的背景颜色。
for idx, color in enumerate("rgbyck"):
plt.subplot(321+idx, facecolor=color)
plt.show()
subplot返回它所创建的Axes对象,可以将它用变量保存起来,然后用sca()交替让他们成为当前Axes对象,并调用plot()在其中绘图。
for idx, color in enumerate("rgbyck"):
plt.subplot(321+idx, facecolor=color)
plt.show()
plt.figure(1) # 创建图表1
plt.figure(2) # 创建图表2
ax1 = plt.subplot(211) # 在图表2中创建子图1
ax2 = plt.subplot(212) # 在图表2中创建子图2
x = np.linspace(0, 3, 100)
for i in x:
plt.figure(1) # 选择图表1
plt.plot(x, np.exp(i*x/3))
plt.sca(ax1) # 选择图表2的子图1
plt.plot(x, np.sin(i*x))
plt.sca(ax2) # 选择图表2的子图2
plt.plot(x, np.cos(i*x))
plt.show()
在循环调用figure(1)让图表1成为当前图表,并在其中绘图。然后调用sca(ax1)和sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。当他们成为当前子图时,包含他们的图表2也自动成为当前图表,因此不需要调用figure(2)。
在图表显示中文
Matplotlib默认配置文件中所使用的的字体无法正确显示中文。为了让图表能够正确显示中文,在.py文件头部加上如下内容。
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
其中,‘SimHei’表示黑体字。常用中文字体及其英文表示如下:
宋体:SimSun,黑体:SimHei,楷体:KaiTi;微软雅黑:Microsoft YaHei,隶书:LiSu,仿宋:FangSong,幼圆:YouYuan,华文宋体:STSong,华文黑体:STHeiti,苹果丽中黑:Apple LiGothic Medium
二、绘制条形图、饼状图、散点图
python中基础图标绘制函数
函数 | 功能 |
---|---|
plt.polt(x,y,label,color,width) | 根据x,y数组绘制点、直线或曲线 |
plt.boxplot(data,notch,position) | 绘制一个箱型图 |
plt.bar(x,height,width,bottom) | 绘制一个条形图 |
plt.barh(bottom,width,height,left) | 绘制一个横向条形图 |
plt.polar(theta,r) | 绘制极坐标图 |
plt.pie(data,explode) | 绘制饼图 |
plt.psd(x,NFFT=256,pad_to,Fs) | 绘制功率谱密度图 |
plt.specgram(x,NFFT=256,pad_to,F) | 绘制谱图 |
plt.cohere(x,y,NFFT=256,Fs) | 绘制X-Y的相关性函数 |
plt.scatter() | 绘制散点图(x,y是长度相同的序列) |
plt.step(x,y,where) | 绘制步阶图 |
plt.hist(x,bins,normed) | 绘制直方图 |
plt.contour(X,Y,Z,N) | 绘制等值线图 |
plt.vlines() | 绘制垂直线图 |
plt.stem(x,y,linefmt,markerfmt,basefmt) | 绘制曲线每个点到水平轴线的垂线 |
plt.plot_date() | 绘制数据日期 |
plt.plothle() | 绘制数据后写入文件 |
pyplot模块的区域填充函数
函数 | 功能 |
---|---|
fill(x,y,c,color) | 填充多边形 |
fill_between(x,y1,y2,where,color) | 填充两条曲线围成的多边形 |
fill_betweenx(y,x1,x2,where,hold) | 填充两条水平线之间的区域 |
直方图
它是一种统计报告图,一般用横轴表示数据类型,纵轴表示分布情况。
pyplot.hist(x,bins=10,color=None,range=None,rwidth=None,orientation=u'vertical',* *kwargs);
hist的主要参数如下:
x:这个参数是arrays,指定每个bin分布在x的位置。
bins:这个参数指定bin(箱子)的个数,也就是总共有几条条状图。
normed:是否对y轴数据进行标准化(如果为True,则是在本区间的点在所有的点中所占有的概率)。
color:这个指定条状图(箱子)的颜色。
range:指定上下界,即最大值和最小值。
条形图
条形图的绘制可以通过pyplot中的bar()或者barh()来实现。bar默认是绘制竖直方向的条形图。也可以通过设置orientation="horizontal"参数来绘制水平方向的条形图。barh()就是绘制水平方向的条形图。
import matplotlib.pyplot as plt
import numpy as np
y = [20, 10, 30, 25, 15, 34, 22, 11]
x = np.arange(8)
plt.bar(x, height=y, color='green', width=0.5)
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(10, 50, 20)
y1 = np.random.randint(10, 50, 20)
y2 = np.random.randint(10, 50, 20)
plt.ylim(0, 100) # 设置y轴的显示范围
plt.bar(x, height=y1, width=0.5, color='red', label='$y1$')
# 设置一个底部,底部就是y1的显示结果,y2在上面继续累加即可
plt.bar(x, height=y2, bottom=y1, width=0.5, color='blue', label='$y2$')
plt.legend()
plt.show()
散点图
散点图是在回归分析中是数据点在直角坐标系平面上的分布图,一般用两组数据构成多个坐标点,考查坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
# 产生100~200的10个随机整数
x = np.random.randint(100, 200, 10)
y = np.random.randint(100, 130, 10)
# x指x轴,y指y轴
# s设置数据点显示的大小面积,c设置显示的颜色
# marker设置显示的形状,"o"是圆,"v"是向下三角形,"^"是向上三角形
# alpha设置点的透明度
plt.scatter(x, y, s=100, c="r", marker="v", alpha=0.5)
plt.show()
饼状图
饼状图显示一个数据系列中各项大小与各项总和的比例。
import matplotlib
import matplotlib.pyplot as plt
# import math
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
labels = ["一季度", "二季度", "三季度", "四季度"]
facts = [25, 40, 20, 15]
explode = [0, 0.03, 0, 0.03]
# 设置显示的一个正圆,长宽比为1:1
plt.axes(aspect = 1)
# x为数据,根据数据在所有数据中所占的比例显示结果
# labels设置每一个数据的标签
# autopct设置每一块所占的百分比
# explode设置某一块或者很多块突出显示出来,由上面定义的explode数组决定
# shadow设置阴影,这样显示的效果更好
plt.pie(x=facts, labels=labels,autopct='%1.1f%%', explode=explode, shadow=True)
plt.show()
参考文献
夏敏捷等. python程序设计从基础开发到数据设计. 清华大学出版社,2019.