matplotlib简介
丰富的第三方模块赋予了python强大的能力,matplotlib作为python最流行的可视化模块之一, 功能强大,用法简便。对于新手而言,其上手难度低,仅需要几行代码就可以创建一个发表质量的图片,而且同时支持静态和动态图片。对于开发者而言,其丰富的子模块提供了对图片中各个细节的精确控制,可以实现高度定制的可视化效果。
在matplotlib创建的图像中,包含了多种元素,示例如下
1. figure
figure是图片的载体,可以看做是画布,图片必须在画布的基础上进行创建
2. axes
axes表示绘图区域或者窗口,用来容纳一张具体的图片。axes位于figure上,同一个figure上可以存在多个axes。
3. axis
axis表示坐标轴,比如常见的x轴,y轴以及对应的刻度线和标签。
4. artist
atrist表示广义的绘图元件,往大了说,figure, axes, axis都属于绘图元件,往小了说,图片标题,图例,刻度,刻度标签等一幅图像上的具体元素都属于绘图元件。
在matplotlib中,有两套绘图语法,第一种是官方推荐的语法,是一种基于面向对象风格的语法,基本用法如下
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 2, 3, 4])
首先通过plt.subplots创建一个figure和axes对象,然后通过axes对象的各种方法来创建图表,上述代码的输出结果如下
这种写法看上去非常的死板,但是在生成复杂图表时,更加的灵活。对于简单的图表,也支持以下写法
plt.plot([1, 2, 3, 4], [1, 2, 3, 4])
上述代码生成的图片和之前的代码是一致的,只不过这里不再需要显示的声明一个figrue和axes对象,而是直接通过matplotlib.pyplot模块来创建简单图表,从代码量来看,更加的简洁。
在matplotlib.pyplot子模块中,实现了matplotlib.axes对象的各种方法,而且隐式的创建了figure和axes对象,调用更加的简单,对于一幅简单图表而言,使用matplotlib.pyplot会带来代码量的简化。
在R语言中,首先需要创建一个图形设备,比如png或者pdf, 绘图代码执行完毕之后,将对应的结果输出到绘图设备,然后保存。在matplotlib中,对应的顺序进行了调整,先执行绘图代码,然后将结果输出到对应的绘图设备,在这里,绘图设备称之为backend。
同样的一段绘图代码,在输出图像时可能输出到png, pdf等各种不同的设备上。对于不同的绘图设备,matplotlib内置了输出代码,作为使用者的我们,不用关系具体的实现过程,只需要根据自己的需求,调整对应的backend即可。
backend可以分为两类:
1. 交互式设备,比如qt,wxpython等GUI窗口
2. 非交互式设备,比如png, jpeg, pdf等各种格式的文件
matplotlib支持的交互式设备列表如下
非交互式设备列表如下
matplotlib模块有内置的backend, 当然也允许我们进行修改,修改的方式有多种,第一种是修改matplotlib的配置文件matplotlibrc, 通过以下代码可以找到该配置文件的位置
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
然后在该文件中,修改backend选项的值。第二种是设置环境变量,MPLBACKEND, 在linux系统的修改方式如下
export MPLBACKEND='agg'
第三种是在绘图脚本的开头进行设置,代码如下
import matplotlib
matplotlib.use('agg')
上述3种方式,优先级依次递增。对于交互式图形设备,绘图代码执行完毕之后,运行以下代码来弹出对应的结果
>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3,4], [1, 2, 3, 4])
[<matplotlib.lines.Line2D object at 0x0AB61130>]
>>> plt.show()
对于非交互式的图形设备,绘图代码执行完毕之后,我们需要通过如下语句,将结果保存到文件中
>>> plt.plot([1,2,3,4], [1, 2, 3, 4])
[<matplotlib.lines.Line2D object at 0x0A9972B0>]
>>> plt.savefig('out.png')
matplotlib提供了丰富的绘图函数,在后续文章中再详细介绍。
- Oracle 12c PDB迁移及ORA-00600错误分析和解决(r10笔记第72天)
- 【Go 语言社区】epoll详解
- Oracle 12c数据库升级实战(r10笔记第70天)
- Oracle 12c升级检查问题分析(r10笔记第69天)
- 转--使用Revel(go)开发网站
- GoldenGate数据迁移的问题总结(二)(r10笔记第85天)
- Elasticsearch究竟要设置多少分片数?
- 设计模式(1)-使用简单工厂优化代码
- 简单易学的机器学习算法——因子分解机(Factorization Machine)
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- golang语言是如何处理栈的
- 【Go 语言社区】并发性
- GoldenGate数据迁移的问题总结(一)(r10笔记第84天)
- Elasticsearch大文件检索性能提升20倍实践(干货)
- 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 数组属性和方法
- Flutter Widgets 之 Container
- Flutter Widgets 之 Row和Column
- Flutter Widgets 之 SafeArea
- Flutter Widgets 之 Wrap
- Flutter Widgets 之 Expanded和Flexible
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践
- Flutter Widgets 之 AnimatedContainer
- Flutter Widgets 之 Opacity 和AnimatedOpacity
- 聊聊常见的服务(接口)认证授权
- Flutter Widgets 之 FutureBuilder
- [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
- Flutter Widgets 之 InkWell 和 Ink
- Flutter Widgets 之 BottomNavigationBar
- Flutter Widgets 之 PageView
- 笔试题:代码如何实现“百钱买百鸡”?