Matplotlib中的“plt”和“ax”到底是什么?
实际上,作为最流行和最基础的数据可视化库,Matplotlib在某些方面有些令人困惑,这些部分经常有人问起。
- 我应该在什么时候使用“axes”
- 为什么有时用“plt”而有时用“ax”?
- 它们之间有什么区别?
在网上有这么多的例子向人们展示如何使用Matplotlib来绘制这种或那种图表,但我很少看到任何教程提到“为什么”。这可能会使编程经验较少或从其他语言(如R)切换到这种语言的人感到非常困惑。
在本文中,我不会教您使用Matplotlib绘制任何特定图表,但会尝试解释有关Matplotlib的基本但重要的内容——人们通常使用的“plt”和“ax”是什么。
概念
注意,当我说“plt”时,它并不存在于Matplotlib库中。它之所以被称为“plt”,是因为大多数Python程序员喜欢导入Matplotlib并创建一个名为“plt”的别名,我相信您应该知道这个别名。
import matplotlib.pyplot as plt
然后,回到我们的主题。为了演示,让我们画一个简单的图表。
import numpy as npplt.plot(np.random.rand(20))
plt.title('test title')
plt.show()
如上面标注的截图所示,当我们使用plt
:
- 将生成一个
figure
对象(以绿色显示) -
Axes
对象是通过绘制的折线图(红色显示)隐式生成的 - 图中的所有元素(如x和y轴)都在
Axes
对象中呈现(蓝色显示)
这也就表示:
-
figure
就像一张纸,你可以画任何你想画的东西 - 我们必须在“单元格”中绘制图表,在此处,
Axes
是坐标轴 - 如果我们只画一个图形,我们不需要先画一个“单元格”,只要在纸上画就可以了。我们可以使用
plt.plot(…)
显式绘制“单元格”
当然,我们可以在“纸”上显式地绘制一个“单元格”,以告诉Matplotlib我们将在这个单元格中绘制一个图表。然后,我们有以下代码。
fig, ax = plt.subplots()
ax.plot(np.random.rand(20))
ax.set_title('test title')
plt.show()
结果完全一样。唯一的区别是我们明确地绘制了“单元格”,这样我们就能够得到Figure
和Axes
对象。
实际上,当我们只想绘制一个图形时,没有必要“绘制”单元格。但是,您必须注意到,当我们想在一个图中绘制多个图时,必须这样做。
n_rows = 2
n_cols = 2fig, axes = plt.subplots(n_rows, n_cols)
for row_num in range(n_rows):
for col_num in range(n_cols):
ax = axes[row_num][col_num]
ax.plot(np.random.rand(20))
ax.set_title(f'Plot ({row_num+1}, {col_num+1})')fig.suptitle('Main title')
fig.tight_layout()
plt.show()
在这个代码片段中,我们首先声明了要“绘制”的行和列的数量。2×2表示我们要画4个单元格。
然后,在每个单元格中,我们绘制一个随机的折线图,并根据其行号和列号分配一个标题。请注意,我们使用的是axis实例。
在此之后,我们在“paper”上定义一个“Main title”,即Figure
实例。所以,我们有这个超级标题,它不属于任何“单元格”,但在幕布上。
最后,在调用show()
方法之前,我们需要要求Figure
实例通过调用它的tight_layout()
方法自动在单元格之间提供足够的填充。
总结
希望现在你能更好地理解plt
和ax
到底是什么。
基本上,plt
是matplotlib的一个常见别名。pyplot被大多数人使用。当我们使用plt
(比如plt.line(…)
)绘制一些东西时,我们隐式地创建了一个图形实例和图形对象内部的坐标轴。当我们只想画一个图的时候,这是非常方便的。
但是,我们可以显式地调用plt .subplot()
来获得Figure
对象和Axes
对象,以便对它们执行更多的操作。当我们想在一个图形上画多个子图时,通常需要使用这种方法。
另外,下面是用于Figure
和Axes
类的Matplotlib官方API引用。强烈建议大家自己去看看它们,并尝试一些方法,以确保自己理解得更深。
https://matplotlib.org/api/axes_api.html?highlight=axes#matplotlib.axes.Axes
https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure
作者:Christopher Tao
deephub翻译组:孟翔杰
DeepHub
- IIS4\IIS5 CGI环境块伪造0day漏洞
- [原创]Fluent NHibernate之旅(四)-- 关系(上)
- 基于流量的OpenSSL漏洞利用检测方法
- [原创]Fluent NHibernate之旅(四)-- 关系(中)
- 华为专家 | 轻量化微服务测试实践
- Android Material Design系列之Navigation Drawer
- [原创]Fluent NHibernate之旅(四)-- 关系(下)
- 一次通过漏洞挖掘成功渗透某网站的过程
- 使用fuzzDB进行web安全测试
- Android Material Design系列之FloatingActionButton和Snackbar
- Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发
- Android Material Design系列之Toolbar
- Struts2 S2-020在Tomcat 8下的命令执行分析
- Struts2再曝S2-020补丁绕过漏洞 – 万恶的正则表达式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python如何实现读取并显示图片(不需要图形界面)
- PHP文件操作实例总结【文件上传、下载、分页】
- Django中Aggregation聚合的基本使用方法
- ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
- PHP反射实际应用示例
- 解决Keras使用GPU资源耗尽的问题
- 如何表示python中的相对路径
- 基于Tensorflow读取MNIST数据集时网络超时的解决方式
- python中的错误如何查看
- python实现斗地主分牌洗牌
- Python Mock模块原理及使用方法详解
- python实现猜数游戏(保存游戏记录)
- PHP实现简单计算器小程序
- PHP单例模式模拟Java Bean实现方法示例
- php实现每日签到功能