Matplotlib简介
Matplotlib 是 Python 从 Matlab 迁移过来的一个 2D 绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形,通过几行代码,就能开发出直方图、饼状图、散点图、三维图等各式各样的专业图表,具有极强的自定义性和可扩展性。下面是 Matplotlib 官网的几个示例图表:
同时由于 Matplotlib 是基于 NumPy (一个科学计算包)和 tkinter (一个图形框架) 二次开发的,Matplotlib 在科学计算结果可视化领域越来越受到欢迎。
Matplotlib组成
- figure:整个画布,包含一个或多个 axes
- axes:画布中的某一个图表,包含一个 plot
- artist:元素,包括图中所示的 label、line 等,也包括 plot
-
![此张图片摘自互联网](https://img-blog.csdnimg.cn/20190123183131790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0,size_16,color_FFFFFF,t_70)
不得不说的 backend
backend是为matplotlib中的绘图功能做幕后工作的,对应的’frontend’指的就是你编辑的绘图命令。通过设置’backend’可以使得matplotlib适应不同的应用场景,或者说输出形式,例如:python中的命令行模式下弹出的figure,图形界面的工具wxpython中嵌入的matplotlib,网页应用服务,批处理脚本生成可视化数据等。
backend可以分为两类:交互式的,包括命令行以及图形界面的集成开发环境;非交互式的,比如输出图片文件(格式为PNG,JPG,PDF等)的。
常见的backend类型:
不可交互型 | 可交互型 |
---|---|
AGG:渲染为 png 文件 | Qt5Agg:使用 Qt5 渲染,IPython 中可使用 %matplotlib qt5 |
PS:渲染为 ps 文件 | macosx:使用 Cocoa 画布渲染,Ipython 中可使用 %matplotlib osx |
PDF:渲染为 pdf 文件 | nbAgg:Jupyter Notebook 中使用的 backend,Jupyter 中使用 %matplotlib notebook 来激活 |
SVG:渲染为 svg 文件 | WXAgg:使用 wxWidgets 库来渲染,Ipython 中可使用 %matplotlib wx |
假如我们要激活 WXAgg 渲染模式,可以使用
import matplotlib
matplotlib.use(‘WXAgg’)
注意激活语句最后紧跟着导入语句,中间不能有 plt.plot() 之类的绘图语句
Matplotlib基本用法
由于Matplotlib是第三方库,请先确保你的电脑上已经安装成功 Matplotlib 库;
一般有下面两种办法:
- 在命令行下输入: pip install matplotlib
- 通过下载whl文件安装,可以参考:
导入
根据开源社区的习惯,一般这样导入
import matplotlib.pyplot as plt
创建画布
plt.figure()
如果在 plt.figure() 后直接 plt.show(),将弹出一个空白图表的画布窗口
具体绘图
Matplotlib 的绘图是面向过程的,具体的绘图操作差不多都在这一步完成,比如我想在一个子图中绘制出sin(x) 和cos(x) ,控制代码如下:
x = np.arange(0,np.pi*2,0.01)
y1 = np.sin(x)
y2 = np.cos(x)
#下面两句代码可以简化为一句代码:
#plt.plot(x,y1,x,y2)
plt.plot(x,y1)
plt.plot(x,y2)
plt.show() 之后,其效果图如下:
plot() 函数只是 Matplotlib 库中最简单的绘图函数,除了横坐标x、纵坐标y外,它还可以通过关键字参数c
(color) 控制线条的颜色,比如plt.plot(x,y1,c="y")
可以使上图中曲线 sin(x) 的颜色变成黄色,通过关键字参数s
(size) 控制线条的粗细等,有具体需求的时候可以查对应的的 API 手册。
pyplot 模块中其他一些重要的绘制函数列表如下:
名称 | 功能 |
---|---|
plt.hist() | 画直方图 |
plt.scatter() | 画散点图 |
plt.bar() | 画柱形图 |
plt.annotate() | 给图像加注释 |
注:绘图部分由于 API 过多,在此仅列出基础函数,后面我会视情况专门出一个针对此部分的教程
显示
plt.show()
将整个画布以及上面的子图显示出来。
一个 Matplotlib 实例
假设我们现在要解决一个需求:
求任意多项式函数的极值并将计算结果可视化
其中函数计算用到了第三方库 sympy ,感兴趣的同学可以先学习,有不懂的地方可以通过邮件联系我;否则可以忽略,我们的注意力放在绘图部分
解决代码
# -*- coding: utf-8 -*-
# author: inspurer(月小水长)
# pc_type lenovo
# create_date: 2019/1/23
# file_name: my_differ
# qq_mail [email protected]
# 安装的时候出现Proxy错误记得关代理
from sympy import *
import numpy as np
import matplotlib.pyplot as plt
# 声明符号 x
x = Symbol("x")
def count_extreme(express):
# 声明 y 表达式
y = express
# y 对 x 求导
dy = diff(y,x)
# 返回导函数的零点
extreme_x_list = solve(dy,x)
if len(extreme_x_list)==0:
return "no extrem vaule"
print(extreme_x_list)
# 声明定义域
plt.figure()
plt.xlabel("X")
# 标签里面必须添加字体变量:fontproperties='SimHei',fontsize=14。不然中文显示可能会乱码
plt.ylabel("Y轴",fontproperties='SimHei',fontsize=14)
defined_x = np.arange(-5,5,0.01)
defined_y = 1/3*defined_x**3-3/2*defined_x**2+2*defined_x
plt.title("y = 1/3*x**3-3/2*x**2+2*x")
plt.plot(defined_x,defined_y)
for i,extreme_x in enumerate(extreme_x_list):
extreme_y = y.evalf(subs={x:extreme_x})
plt.scatter(extreme_x,extreme_y,s=50,c="red")
# xytext -- 为注解内容位置坐标,当该值为None时,注解内容放置在xy处
# xycoords and textcoords 是坐标xy与xytext的说明,若textcoords=None,则默认textNone与xycoords相同,
# 若都未设置,默认为data,
# arrowprops 用于设置箭头的形状,类型为字典类型
plt.annotate('y(%.4s)=%.4s' % (extreme_x,extreme_y), xy=(extreme_x, extreme_y), xycoords='data', xytext=((-1)**(i+1)*30, (-1)**(i+1)*30),
textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
plt.show()
if __name__ == "__main__":
count_extreme(1/3*x**3-3/2*x**2+2*x)
可视化结果
其中函数表达式是以y = 1/3*x**3-3/2*x**2+2*x
为例的,可以在代码的最后一行自定义修改
参考了博客:
https://blog.csdn.net/xiaoqu001/article/details/78726735