关于 Matplotlib:Matplotlib 是 Python 的库(数据可视化库),又是开发中常用的库。 Matplotlib 的功能强大,可以很容易与Numpy、Pandas 等程序库结合在一起使用。
Matplotlib 的功能:Matplotlib 是一个 Python 的 2D 绘图库。通过 Matplotlib,开发者可以仅需要几行代码,便可生成绘图,直方图,功率谱,条形图,错误图,散点图等。
使用 Matplotlib 好处:学习 Matplotlib,可让数据可视化,更直观的真实给用户。使数据更加客观、更具有说服力。
小贴士:
- 下文中多处使用到 Numpy 模块,若对其不熟悉,可先浏览:AI算法工程师 | 03人工智能基础-Python科学计算和可视化(一)Numpy
说明
pip install matplotlib
测试与安装
若不清楚 Python 环境是否安装了 Matplotlib,可先测试:
win + R
后输入“cmd
” → 在 cmd 的命令窗口输入 python
→import matplotlib
并回车 →ModuleNotFoundError: No module named 'Matplotlib'
”,说明未安装 Numpy;若什么都没显示,则说明已安装。exit()
可退出 python 环境。cmd 中使用 pip 命令安装 Matplotlib:(注意该命令是在 cmd 中,而非 python 环境中)
# 安装命令(不指定版本)
pip install matplotlib
# 注意:该安装方式相对简单,但可能存在当前 Matplotlib 版本与 Python 环境不兼容情况,不适用所有
# ——(相对谨慎的做法:根据当前的 python 版本选择对应适用的 Matplotlib 版本)
安装完成后,可以测试一下 Matplotlib 是否安装成功。下面是导入 matplotlib.pyplot 模块的语句,若不出错,说明 Matplotlib 已经安装成功了。如:(该语句是在 python 环境中输入)
# Pyplot 是 Matplotlib 的子库,是常用的绘图模块,且包含一系列绘图函数的相关函数,能很方便的让用户绘制出 2D 图表。
# Pyplot 是 Matplotlib 中常使用的库,所以经常需要导入它进行使用。
# 导入 matplotlib 的子模块 pyplot,并起别名为 plt
import matplotlib.pyplot as plt
# 扩:这是查看 matplotlib 库的版本号的命令
import matplotlib
matplotlib.__version__
在使用 Matplotlib 绘制图形时,其中有两个最为常用的场景:① 画点,② 画线
pyplot 基本方法:
方法名 | 说明 |
---|---|
title() | 设置图表的名称 |
xlabel() | 设置 x 轴名称 |
ylabel() | 设置 y 轴名称 |
xticks(x,ticks,rotation) | 设置 x 轴的刻度,rotation 旋转角度 |
yticks() | 设置 y 轴的刻度 |
plot() | 绘制线性图表 |
show() | 显示图表 |
legend() | 显示图例 |
text(x,y,text) | 显示每条数据的值(x,y 值的位置) |
figure(name,figsize=(w,h),dpi=n) | 设置图片大小 |
关于直线的绘制
在使用 Matplotlib 绘制线性图时,其中最简单的是绘制线图。
以后续的使用 Matplotlib 绘制一个简单的直线的代码为例,其具体实现过程为:
pyplot
,并给它指定别名 plt
,以免反复输入 pyplot。在模块 pyplot 中包含很多用于生产图表的函数;plot()
;plt.show()
打开 Matplotlib 查看器,显示绘制的图形。示例 - 绘制直线
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块,并起别名为 plt
plt.plot([0,2],[1,3]) # 将(0,1)点和(2,3)连起来(plot 默认画直线图 )
plt.show() # 展示图形
示例 - 绘制折线
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
squares=[1,4,9,16,25] # 平方数序列
plt.plot(x,squares) # 将5个点连接起来:(1,1) (2,4) (3,9) (4,16) (5,25)
plt.show()
示例 - 设置样式
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.plot(x,squares,linewidth=4) #设置线条宽度
#设置图标标题,并在坐标轴上添加标签
plt.title("数字",fontsize=18)
plt.xlabel('datas',fontsize=14)
plt.ylabel('squares',fontsize=14)
plt.show() # 展示图形
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签。SimHei(黑体)
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.plot(x,squares,linewidth=4) #设置线条宽度
#设置图标标题,并在坐标轴上添加标签
plt.title("数字",fontsize=18)
plt.xlabel('datas',fontsize=14)
plt.ylabel('squares',fontsize=14)
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签(中文乱码问题)
plt.show() # 展示图形
Matplotlib 有很多函数用于绘制各种图形,其中 plot 函数用于曲线,需要将 200 个点的 x x x 坐标和 y y y 坐标分别以序列的形式传入 plot 函数,然后调用 show 函数显示绘制的图形——一元二次方程的曲线。
示例 - 绘制曲线
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-100,100) # 200 个点的 x 坐标
y=[i*i for i in x] # 生成 y 点的坐标:遍历x,把里面的每个元素进行平方
plt.plot(x,y) #绘制一元二次曲线
plt.show()
plt.rcParams['axes.unicode_minus'] = False
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-100,100) # 200 个点的 x 坐标
y=[i*i for i in x] # 生成 y 点的坐标
plt.plot(x,y) #绘制一元二次曲线
plt.rcParams['axes.unicode_minus'] = False # 解决中文字体下坐标轴负数的负号显示问题
plt.show()
plt.savefig('name.jpg') # 括号中内容的含义:保存图片命名为 name.jpg
plt.savefig('name') # 括号中内容的含义:保存图片命名为 name.png
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-100,100) # 200 个点的 x 坐标
y=[i*i for i in x] # 生成 y 点的坐标
plt.plot(x,y) #绘制一元二次曲线
plt.rcParams['axes.unicode_minus'] = False # 解决中文字体下坐标轴负数的负号显示问题
# 将绘制后的图形 保存 为图片
plt.savefig('result.jpg') # 可以保存图形(在脚本所在位置可以看到图片)
# plt.savefig('result') # 会生成 result.png
plt.show()
使用 matplotlib 根据两点绘制一条线使用 plt 函数绘制任何曲线的第一步都是生成若干个坐标点(x,y),理论上坐标点是越多越好。
示例 - 绘制正弦、余弦曲线
import matplotlib.pyplot as plt
import numpy as np
# 生成 x 的坐标(0-20 的 100 个等差数列)
x = np.linspace(0,20,100) # linspace 用于创建一个一维数组(等差数列构成)
# 将 100 个 x 坐标值一起传入 Numpy 的 sin 和 cos 函数
sin_y = np.sin(x)
cos_y = np.cos(x)
# 使用 plot 函数绘制正弦曲线和余弦曲线
plt.plot(x,sin_y)
plt.plot(x,cos_y)
plt.show()
import matplotlib.pyplot as plt
import numpy as np
# 生成 x 的坐标(0-20 的 100 个等差数列)
x = np.linspace(0,20,100)
# 将 100 个 x 坐标值一起传入 Numpy 的 sin 和 cos 函数
sin_y = np.sin(x)
cos_y = np.cos(x)
# 使用 plot 函数绘制正弦曲线和余弦曲线
# 可直接plt.plot(x, sin_y)、plt.plot(x, cos_y)合写成如下语句
# 语句说明:在 plt.plot() 参数中包含两对 x,y 值,
# —— 第一对是 x,sin_y,(对应于正弦函数);第二对是 x,cos_y,(对应于正弦函数)
plt.plot(x,sin_y,x,cos_y)
plt.show()
# figure(name,figsize=(w,h),dpi=n) 设置图片大小
# 参数说明:
# name: 设置图像编号或名称(可选);
# figsize:设置画布的大小,单位为英寸(w:宽;h: 高);
# dpi: 指定绘图对象的分辨率(每英寸多少个像素),默认为80
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,20,100) # 生成 x 的坐标
sin_y = np.sin(x)
cos_y = np.cos(x)
# 使用画布调整大小
plt.figure(figsize=(8,5), dpi=80) # 创建一个 8 * 5 点(point)的图,并设置分辨率为 80
plt.plot(x,sin_y,x,cos_y) # 使用 plot 函数绘制正弦曲线和余弦曲线
plt.show()
小贴士:
- 关于 Matplotlib 中 pyplot 的 figure 函数的使用,可参考: Matplotlib之Figure的使用 by樊i
# subplot()函数将画布分区的使用
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,20,100) # 生成 x 的坐标
# 将画布分为 2 行 2 列:
plt.subplot(2,2,1) # 将图画到画布的 1 区域
plt.plot(x,np.sin(x)) # 绘制正弦曲线
plt.subplot(2,2,3) # 将图画到画布的 3 区域
plt.plot(x,np.sin(x)) # 绘制余弦曲线
plt.show()
小贴士:
- 关于画布分区的详细介绍,可参考: 菜鸟教程——Matplotlib 绘制多图:subplot() 和 subplots() 方法
使用 scatter 函数可以绘制随机点,该函数需要接收 x x x 坐标和 y y y 坐标的序列。
示例1 - 绘制散点图
import matplotlib.pyplot as plt
import numpy as np
# 画散点图
x = np.linspace(0,10,100) # 生成0到10中100个等差数
plt.scatter(x,np.sin(x))
plt.show()
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(66666) # 设定随机种子(每次执行结果一样)
x=np.random.rand(100) # 生成一百个随机点([0, 1)之间的均匀随机数)
y=np.random.rand(100)
colors=np.random.rand(100)
size=np.random.rand(100)*1000 # 乘以1000是为了让数值变大些
plt.scatter(x,y,c=colors,s=size,alpha=0.7) # alpha:透明度
plt.show()
示例2 - 绘制线
作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,10,100) # 生成0到10中100个等差数
plt.plot(x,x+0,'-b') # 实线 蓝色
plt.plot(x,x+1,'--g') # 短横线 绿色
plt.plot(x,x+2,'-.y') # 点划线 黄色
plt.plot(x,x+3,':c') # 虚线 青色
plt.plot(x,x+4,'dr') # 窄菱形标记 红色
plt.plot(x,x+5,'o') # 圆标记 默认蓝色
plt.plot(x,x+6,'x') # 叉叉 默认橙色
plt.show()
import matplotlib.pyplot as plt
import numpy as np
# 不同种类不同颜色的线并添加图例
x = np.linspace(0,10,100) # 生成0到10中100个等差数
plt.plot(x,x+0,'-b',label='-b') # 实线 蓝色
plt.plot(x,x+1,'--g',label='--g') # 短横线 绿色
plt.plot(x,x+2,'-.y',label='-.y') # 点划线 黄色
plt.plot(x,x+3,':c',label=':c') # 虚线 青色
plt.plot(x,x+4,'dr',label='dr') # 窄菱形标记 红色
plt.plot(x,x+5,'o',label='o') # 圆标记 默认蓝色
plt.plot(x,x+6,'x',label='x') # 叉叉 默认橙色
# 添加图例(右下角lower right 左上角upper left) 边框 透明度 阴影 边框宽度
plt.legend(loc='lower right',fancybox=True,framealpha=1,shadow=True,borderpad=0.4)
plt.show()
关于柱状图的绘制
使用 pyplot 中的 bar 函数可以绘制柱状图
pyplot.bar(x,y) # 竖直柱状图
)、横向对比(如:pyplot.barh(x,y) # 水平柱状图
)。语法格式:
# bar() 方法绘制柱形图
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
"""
参数说明:
· x:柱形图的 x 轴数据
· height:柱形图的高度
· width:柱形图的宽度(默认 0.8)
· bottom:y 坐标(默认 0)
· align:柱形图与 x 坐标的对齐方式
① 'center' 以 x 位置为中心(默认值);
② 'edge':将柱形图的左边缘与 x 位置对齐;
③ 若要对齐右边缘的条形:可传递负数的宽度值及 align='edge'。
· **kwargs:其他参数
"""
示例1 - 绘制柱状图
import matplotlib.pyplot as plt # 导入模块
import numpy as np
x = [1980,1985,1990,1995]
y = [1000,3000,4000,5000]
plt.bar(x,y) # 绘制柱状图
plt.show() # 展示图形
import matplotlib.pyplot as plt # 导入模块
import numpy as np
# 数据
x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]
# 绘制柱状图
plt.bar(x,y)
# 润色(标签、名称、标题)
plt.xticks(x,x_labels) # 设置x轴替换标签
plt.xlabel('年份') # 显示 x 轴名称
plt.ylabel('销量') # 显示 y 轴名称
plt.title('根据年份销量对比图') # 图的标题
# 将全局的字体设置为黑体 (使中文正常显示)
plt.rcParams['font.sans-serif']=['SimHei']
plt.show()
import matplotlib.pyplot as plt # 导入模块
import numpy as np
# 数据
x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]
# 绘制柱状图(设置柱的宽度、颜色)
plt.bar(x,y,width=2,color="red") # 颜色也可用缩写,如:红色 color="r"
# 润色(标签、名称、标题)
plt.xticks(x,x_labels) # 设置x轴替换标签
plt.xlabel('年份') # 显示 x 轴名称
plt.ylabel('销量') # 显示 y 轴名称
plt.title('根据年份销量对比图') # 图的标题
# 将全局的字体设置为黑体 (使中文正常显示)
plt.rcParams['font.sans-serif']=['SimHei']
plt.show()
示例2 - 绘制水平柱状图
import matplotlib.pyplot as plt # 导入模块
import numpy as np
x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]
plt.barh(x,y) # 水平的柱子
plt.yticks(x,x_labels) # 设置y轴替换标签
plt.ylabel('年份') # 显示 y 轴名称
plt.xlabel('销量') # 显示 x 轴名称
plt.title('根据年份销量对比图') # 图的标题
plt.rcParams['font.sans-serif']=['SimHei'] # 将全局的字体设置为黑体 (使中文正常显示)
plt.show()
import matplotlib.pyplot as plt # 导入模块
import numpy as np
x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]
plt.barh(x,y,height=2) # 水平的柱子,通过 hight 设置柱子的“宽度”
plt.yticks(x,x_labels) # 设置y轴替换标签
plt.ylabel('年份') # 显示 y 轴名称
plt.xlabel('销量') # 显示 x 轴名称
plt.title('根据年份销量对比图') # 图的标题
plt.rcParams['font.sans-serif']=['SimHei'] # 将全局的字体设置为黑体 (使中文正常显示)
plt.show()
import matplotlib.pyplot as plt # 导入模块
import numpy as np
# 数据
np.random.seed(6)
x=np.arange(5)
y=np.random.randint(-5,5,5)
print(x,y)
# 左侧绘竖直柱状图
plt.subplot(1,2,1) # 将画布分隔成 一行两列,在左侧画(第一列画)
v_bar=plt.bar(x,y) # 在第一列中画图
plt.axhline(0,color='blue',linewidth=2) # 在第一列的画布中 0位置画一条蓝线
# 右侧绘水平柱状图
plt.subplot(1,2,2) # 在右侧画(第二列画)
h_bar=plt.barh(x,y,color='red') # barh 将y和x轴对换 竖着方向为 x 轴
plt.axvline(0,color='red',linewidth=2) # 在第二列的画布中0位置处画红色的线
示例3 - 综合
import matplotlib.pyplot as plt # 导入模块
import numpy as np
# 数据
names=['唐人街探案3','捉妖记2','中国机长','你好,李焕英']
y_num1=[10.11,8.18,7.5]
y_num2=[5.47,3.73,2.85]
y_num3=[2.09,2.61,2.87]
y_num4=[2.91,3.02,4.56]
# 生成 x 第1天 第2天 第3天
x=np.arange(len(y_num1)) # 求有多少天,并生成一个序列
print(x)
x_label=['第{}天'.format(i+1) for i in range(len(y_num1))] # 遍历
print(x_label)
# 绘制柱状图
plt.figure(figsize=[8,6], dpi=80) # 设置图形大小
width=0.2 # 设置单个柱状图宽度
plt.bar(x,y_num1,color='#ff7f50',width=width,label=names[0])
plt.bar([i+width for i in x],y_num2,color='#87cefa',width=width,label=names[1])
plt.bar([i+2*width for i in x],y_num3,color='#DA70D6',width=width,label=names[2])
plt.bar([i+3*width for i in x],y_num4,color='#32CD32',width=width,label=names[3])
# 将全局的字体设置为黑体
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
# 设置 x轴、y轴
plt.xticks([i+(3*width)/2 for i in x],x_label)# index+3*width/2 使得标签居中显示
plt.xlabel('上映天数', size=12) # 显示 x 轴名称
plt.ylabel('票房数(单位:亿)', size=12) # 显示 y 轴名称
# 设置图例及标题属性
plt.legend() # 添加图例(默认右上角)
plt.title('上映3天的影片单日票房数', size=16) # 添加标题
plt.savefig('票房对比.jpg') # 保存图形(在脚本所在位置可以看到图片)
plt.show() # 展示图形
代码参考:Python绘制并列柱状图
数据来源:https://ys.endata.cn/BoxOffice/Ranking
说明 - 关于bar 函数中的 width 参数
需要注意的是 bar 函数的宽度并不是像素宽度!
小贴士:
- 设置柱形图的宽度:① bar 函数使用 width 设置;② barh 函数使用 height 设置 height
- bar 函数中的 width:其宽度并不是像素宽度,width 指定的宽度是通过计算得到的标准柱宽度的倍数。(同样的,barh 函数中的 height 也是如此)
pie 函数可以绘制饼状图,饼图主要是用来呈现比例的。只要传入比例数据即可。
示例 - 绘制饼状图
import matplotlib.pyplot as plt # 导入模块
import numpy as np
nums = np.array([12, 22, 6, 18])
plt.pie(nums) # 传入数据,绘制饼图
plt.show()
import matplotlib.pyplot as plt # 导入模块
# 数据(男、女人数及比例)
man = 88888
woman = 66666
man_perc = man/(man+woman)
woman_perc = woman/(man+woman)
labels = ['男','女'] # 标签
colors = ['blue','red'] # 颜色
# 设置字体(用来正常显示中文标签)
plt.rcParams['font.sans-serif']=['SimHei']
# 绘制饼状图
# labels:标签名称 colors:颜色,explode:分裂程度 autopct:显示百分比
paches,texts,autotexts = plt.pie([man_perc,woman_perc],labels=labels,
colors=colors,explode=(0,0.1),autopct='%0.1f%%')
for text in autotexts: # 遍历,设置饼状图中的字体颜色
text.set_color('white')
for text in texts+autotexts: # 设置字体大小
text.set_fontsize(18)
plt.show() # 展示图形
直方图与柱状图都是由若干个柱组成,其分格类似,但含义不同:
使用 hist 函数可绘制直方图(Histogram)。
示例 - 绘制直方图
import matplotlib.pyplot as plt # 导入模块
import numpy as np
x = np.random.randn(1000) # 生成1000个值(标准正态分布)
plt.hist(x) # 绘制直方图(1000个值 会按照 x 轴分割,分成10个组,每组求平均值)
import matplotlib.pyplot as plt # 导入模块
import numpy as np
x = np.random.randn(1000) # 生成1000个值(标准正态分布)
# plt.hist(x) # (1000个值 会按照 x 轴分割,分成10个组,每组求平均值)
plt.hist(x, bins=100) # 装箱(bins 柱数,默认10,此处设置100:分成100份,使每个柱看起来更平滑)
import matplotlib.pyplot as plt # 导入模块
import numpy as np
# normal:正太分布 (第一个参数 loc:期望)(第二个 scale:方差) (第三个 size 形状)
x1=np.random.normal(0,0.8,1000)
x2=np.random.normal(-2,1,1000)
x3=np.random.normal(3,2,1000)
# 参数 bins:装箱,alpha:透明度
kwargs=dict(bins=100,alpha=0.4) # 设置字典
plt.hist(x1,**kwargs) # **kwargs:以字典的形式传参
plt.hist(x2,**kwargs)
plt.hist(x3,**kwargs)
小贴士:
- 由于使用的 Jupyter Notebook 编写的代码,所以最后省略
plt.show()
这一步也可展示图形。- 当然,若是无法显示图形,可在代码开头写上
%matplotlib inline
,其功能为:可以内嵌绘图。 (注意:该语句对其他工具,如 pycharm 不适用)
等高线图实际上是个三维图形,有 x , y , z x,y,z x,y,z 轴。而呈现的是俯视效果,即:将三维映射到二维中画图。
示例 - 绘制等高线图
import matplotlib.pyplot as plt # 导入模块
import numpy as np
# 生成数据
x = np.linspace(-10,10,100) # 等份切分,根据 linspace 找到100个点
y = np.linspace(-10,10,100)
X,Y = np.meshgrid(x,y) # 计算 x 和 y 的相交点 a(网格线)
print(X.shape,Y.shape) # 查看 X 和 Y 的形状
Z = np.sqrt(X**2+Y**2) # 计算 Z 的坐标
print(Z.shape) # 查看 Z 的形状
# 画等高线图
plt.contourf(X,Y,Z)
# 图形中:颜色越深表示值越小,中间的黑色表示 z=0
# 使用的是上方的数据
plt.contour(X,Y,Z) # 画等高线图,但不填充颜色
使用 pyplot 包和 Matplotlib 绘制三维图。
示例 - 绘制三维图
import matplotlib.pyplot as plt # 导入模块
from mpl_toolkits.mplot3d import Axes3D # 导入 3D 包
# 创建 X、Y、Z 坐标
X=[1,1,2,2]
Y=[3,4,4,3]
Z=[1,100,1,1]
fig = plt.figure() # 创建画布
ax = Axes3D(fig) # 创建了一个 Axes3D 的子图放到 figure 画布里
ax.plot_trisurf(X, Y, Z) # 绘制3D曲面
plt.show()
import matplotlib.pyplot as plt # 导入模块
from mpl_toolkits.mplot3d import Axes3D # 导入 3D 包
# 创建 X、Y、Z 坐标
X=[1,1,2,2]
Y=[3,4,4,3]
Z=[1,100,1,1]
fig = plt.figure() # 创建画布
# ax = Axes3D(fig) # 创建了一个 Axes3D 的子图放到 figure 画布里
ax = Axes3D(fig,auto_add_to_figure=False)
fig.add_axes(ax)
ax.plot_trisurf(X, Y, Z) # 绘制3D曲面
plt.show()
—— 说明:本文内容基于python3,使用工具 Jupyter Notebook
编写的代码
(本文写于 2022.7.24 ~ 7.30)