前言
大家好,我是初心,这篇文章主要讲解Python数据分析三剑客之一——Matplotlib的绘图使用,收录于初心的《大数据》专栏。
作者水平有限,不足之处,还请大佬不吝赐教👏👏。
一、简介
1.1 数据可视化
如果将文本数据与图表数据相比较,人类的思维模式更适合于理解后者,它对于人类视觉的冲击更强,这种使用图表来表示数据的方法被叫做 数据可视化
。使用不同种类的图表对原始数据进行可视化处理,会使得复杂的数据更容易理解与使用。
1.2 什么是Matplotlib
Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。比如说通过Python语言调用Matplotlib库绘制折线图、矩形图、柱状图等。Matplotlib 通常与 NumPy、Pandas 一起使用,是数据分析中不可或缺的重要工具之一。
Matplotlib 由三个不同的层次结构组成,分别是脚本层、美工层和后端层。
Matplotlib 生成的图形主要由以下几个部分构成:
Figure:指整个图形,可以理解成一张画布,它包括了所有的元素,比如标题、轴线等;
Axes:绘制 2D 图像的实际区域,也称为轴域区,或者绘图区;
Axis:指坐标系中的垂直轴与水平轴,包含轴的长度大小(图中轴长为 7)、轴标签(指 x 轴,y轴)和刻度标签;
Artist:在画布上看到的所有元素都属于 Artist 对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)等。
二、使用步骤
下面是使用Matplotlib绘制2D图的最简单示例:
from matplotlib import pyplot as plt x = range(2,26,2) y = [12,23,24,23,23,25,36,36,35,30,25,20] plt.plot(x,y) plt.show()
2.1 设置图片大小
通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。
参数 | 说明 |
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
facecolor | 背景颜色,取值可以是16进制,字符串 |
dgecolor | 边框颜色 |
frameon | 是否显示边框,取值为True/False |
plt.figure(figsize=(14,6),dpi=200,facecolor='#00ff00',edgecolor='#ff00ff',frameon=True)
2.2 保存图片
通过调用 pyplot 模块中 savefig() 函数来保存图片到本地。参数fname是路径名和路径。
plt.savefig("../images/test2.svg") plt.savefig("F:\\Codes\\2022-2023-2\\Python\\jupyter notebook\\test2.png")
2.3 设置X|Y轴的刻度
xticks() 和 yticks() 函数接受一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。
# 设置x的刻度 step = [i / 2 for i in range(4, 49, 1)] print(step[::20]) plt.xticks(step) # 设置y的刻度 step_y = range(min(y), max(y),2) plt.yticks(step_y)
2.4 显示中文
当不对 Matplotlib 进行设置,而直接使用中文时,绘制的图像会出现中文乱码。可以使用 rc() 函数设置中文字体。
font = {'family': 'Microsoft YaHei', 'weight': 'bold', 'size': '10'} matplotlib.rc('font', **font)
2.5 设置坐标轴标签和标题
可以通过 xlabel() 函数和 ylabel() 函数进行坐标轴标签设置。
plt.xlabel("时间") plt.ylabel("温度")
如果要设置线条的含义,在传递 x y 轴时也传入label。
y1 = [random.randint(20,40) for i in range(1,11)] plt.plot(x,y1,label='随机数1',color='blue') y2 = [random.randint(40,60) for i in range(1,11)] plt.plot(x,y2,label='随机数2',color='red')
三、绘制图形
3.1 双轴图
Matplotlib 提供的 twinx() 和 twiny() 函数,除了可以实现绘制双轴的功能外,还可以使用不同的单位来绘制曲线,比如一个轴绘制对函数,另外一个轴绘制指数函数。这里需要区分是双线图和双轴图,请看图片示例:
下面是绘制两条折线的双轴图,供大家参考。
from matplotlib import pyplot as plt import matplotlib import numpy as np import random %matplotlib inline # 绘制双轴图 # 设置中文字体 font = {'family': 'Microsoft YaHei', 'weight': 'bold', 'size': '8'} matplotlib.rc('font',**font) # 设置图片大小和清晰度,并创建图形对象 fig = plt.figure(figsize=(14,6),dpi=300,edgecolor='#ff00ff',frameon=True) # 添加子图区域 a1 = fig.add_axes([0,0,1,1]) # 设置x轴 x = [ i for i in range(1,11)] # 设置y1轴(生成10个随机数) y1 = [random.randint(20,40) for i in range(1,11)] a1.plot(x,y1) a1.set_xlabel('随机时间') a1.set_ylabel('随机数1') # 添加双轴 a2 = a1.twinx() # 设置y2轴(生成10个随机数) y2 = [random.randint(40,60) for i in range(1,11)] a2.plot(x,y2) a2.set_ylabel('随机数2') # 设置X、Y轴的标签 # 展示线条的含义 fig.legend(labels=('exp','log'),loc='upper left') plt.show()
3.2 柱状图
柱状图是一种用矩形柱来表示数据分类的图表,柱状图可以垂直绘制,也可以水平绘制,它的高度与其所表示的数值成正比关系。Matplotlib 提供了 bar() 函数来绘制柱状图,当它与 axes 对象(子图对象)一起使用时,它可以应用在 MATLAB 样式以及面向
参数 | 说明 |
x | 一个序列,代表柱状图的x坐标,默认x取值是每个柱状图所在的中点位置,也可以是柱状图左侧边缘位置 |
height | 一个序列,柱状图的数据(高度) |
width | 柱状图的默认宽度值为 0.8 |
bottom | 柱状图的y坐标默认为None |
algin | 有两个可选项 {“center”,“edge”},默认为 ‘center’,该参数决定 x 值位于柱状图的位置 |
下面是绘制一个双柱状图的代码,供大家参考。
from matplotlib import pyplot as plt %matplotlib inline import numpy as np # 准备数据 man_data = [20,34,30,35,27] woman_data = [25,32,34,20,25] labels = ['G1','G2','G3','G4','G5'] # 创建图形对象 fig = plt.figure(figsize=(14,6),dpi=200) # 添加子图区域 ax = fig.add_axes([0,0,1,1]) # x位置 x = np.arange(5) ax.bar(x,man_data,width=0.25) ax.bar(x+0.25,woman_data,width=0.25) # 设置标题 ax.set_title("Scores by group and gender") # 设置Y标签 ax.set_ylabel('Scores') ax.set_xlabel('G等级') # 设置柱状图的含义 ax.legend(labels=('Men','Women'),loc='upper left') # 展示图形 fig.show()
3.3 直方图
直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。可以使用 matplotlib.pyplot.hist()函数 来绘制直方图。
参数 | 说明 |
x | 必填参数,数组或者数组序列 |
bins | 可选参数,整数或者序列,bins 表示区间(长条的数目),默认会生成10个间隔 |
range | 指定全局间隔的下限与上限值 (min,max),元组类型 |
下面是绘制直方图的代码实例,供大家参考。subplots() 函数 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象。
from matplotlib import pyplot as plt %matplotlib inline import random import numpy as np # 创建图形和轴对象 fig,ax = plt.subplots() # 创建数据100个 data = [random.randint(0,800) for i in range(0,100)] print(data) bin = [0,100,200,300,400,500,600,700,800] # 绘制直方图 ax.hist(data,bin) # 设置x、y的含义 ax.set_xlabel('数据') ax.set_ylabel('频数/频率') ax.set_title('频数/频率分布直方图') ax.set_xticks([0,100,200,300,400,500,600,700,800]) plt.show()
3.4 饼状图
饼状图显示一个数据系列中各项目的占项目总和的百分比。Matplotlib 提供了一个 pie() 函数
,该函数可以生成数组中数据的饼状图,可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。
参数 | 说明 |
X | 数组序列,数组元素对应扇形区域的数量大小 |
labels | 列表字符串序列,为每个扇形区域备注一个标签名字 |
color | 为每个扇形区域设置颜色 |
autopct | 格式化字符串"fmt%pct",使用百分比的格式设置每个扇形区的标签,并将其放置在扇形区内 |
下面是绘制饼状图的代码示例,供大家参考。
from matplotlib import pyplot as plt %matplotlib inline import numpy as np # 创建图形对象 fig = plt.figure() # 创建子图 ax = fig.add_axes([0,0,1,1]) # 让饼状图变成圆形 ax.axis('equal') # 准备数据 labels = ['Hogs','Frogs','Logs','Dogs'] num_data = [23,32,10,52] # 饼状图之间的间隙大小 explode = (0.02,0.03,0.02,0.01) # 画饼 ax.pie(num_data,labels=labels,autopct='%1.1f%%',explode=explode) plt.show()
3.5 折线图
折线图可以直观的反映数据的变化趋势,Matplotlib 并没有直接提供绘制折线图的函数。
下面是绘制折线图的示例,供大家参考。
from matplotlib import pyplot as plt %matplotlib inline import numpy as np import random # 创建图形对象 fig = plt.figure() # 创建子图 ax = fig.add_axes([0,0,1,1]) # 日期 date = [i for i in range(10,21)] print(date) # 投篮数量 number_1 = [random.randint(30,50) for i in range(10,21)] number_2 = [random.randint(30,50) for i in range(10,21)] # 绘制曲线 plt.plot(date,number_1,'r',marker='*',markersize=10) plt.plot(date,number_2,'g',marker='*',markersize=10) # 设置含义 plt.xlabel('日期') plt.ylabel('投篮数量') plt.title('2020年2月3日两人投篮数据') # 设置刻度 plt.xticks(date) plt.yticks([i for i in range(30,50)]) # 对折线的解释和在图中的位置 plt.legend(['小王','小黑子'],loc='upper right') plt.show()
3.6 散点图
散点图用于在水平轴和垂直轴上绘制数据点,它表示了因变量随自变量变化的趋势,每个散点值都由该点在图表中的坐标位置表示。可以使用 pyplot 中的 scatter() 函数
来绘制散点图。
from matplotlib import pyplot as plt %matplotlib inline import numpy as np import random # 数据范围 data_range = [1,2,3,4,5,6,7,8] # 8个数据 datas = [[random.randint(0,30) for i in range(0,8)]] # 定义点的大小 sizes = np.array([20,50,30,200,500,1000,60,90]) # 定义点的颜色 colors = np.array(["red","green","black","orange","purple","beige","cyan","magenta"]) # 创建图形对象 fig = plt.figure() ax = fig.add_axes([0,0,1,1]) ax.scatter(data_range,datas,label='数量',s=sizes,c=colors) plt.xlabel('天数') plt.ylabel('数量') plt.title('数量随时间变化') plt.legend(loc='upper left') plt.show()
总结
以上就是今天要讲的全部内容了,本文简单介绍了 Matplotlib的 使用,通过这篇文章的学习我们能大致掌握使用 Matplotlib 绘制图形的技巧。💞
😊 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
😍 本文由初心原创,首发于CSDN博客
😊 欲戴皇冠,必承其重,喜欢的话记得点赞收藏哦!💞