Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。 Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包
官方文档
https://matplotlib.org/users/index.html
这里基本是按照文档的第一篇看下来,一边读一边实践
Matplotlib库类似于Matlab,使用之前先导入
# sphinx_gallery_thumbnail_number = 3
'''
科学计算包+画图包,要用到matplotlib.pyplot
'''
import matplotlib.pyplot as plt
import numpy as np
图像的构成
做好一张图,要除了数据集图像要画好,也要处理好表头、标签、坐标轴等一系列的地方,对应不同的设置函数和API
先解释几个概念:(实际上是三个类)
Axes:
是我们理解的‘一张图’,一张子图,每个子图有自己对应的坐标系和数据集
通过set_xlim() and set_ylim()函数来控制数据
set_title()来设置标题
x-label (set via set_xlabel()), and a y-label set via set_ylabel()).设置标签
具体这几个函数用到的时候在展开
Axis:
这个类来设置坐标轴/刻度线等等
Artist
文档讲Basically everything you can see on the figure is an artist
所有图中看到的东西都是Artist,这个class里面是图中的其他地方的设置,让数据可视化变得好看、清楚的东西
eg:
fig, ax_lst = plt.subplots(2, 2)
fig.suptitle('aaa')
plt.show()
获得了一个2*2的子图
查阅subplots的文档
>>> help(plt.subplots)
Help on function subplots in module matplotlib.pyplot:
subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
Create a figure and a set of subplots.
前两个参数对应n行m列
三四个参数是设置,是否公用x,y轴,有四种情况
设置为 True 或者 ‘all’ 时,所有子图共享 x 轴或者 y 轴,
设置为 False or ‘none’ 时,所有子图的 x,y 轴均为独立,
设置为 ‘row’ 时,每一行的子图会共享 x 或者 y 轴,
设置为 ‘col’ 时,每一列的子图会共享 x 或者 y 轴
后面的几个参数与函数的返回值有关,就不具体展开了
可以通过以下方式,对每个子图操作
fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})
'''例如这样,可以对两个子图分开进行处理'''
数据输入
文档建议用pandas 或者np.matrix 的方法来输入数据集
前者本菜鸡没有接触过,后者栗子如下:
b = np.matrix([[1,2],[3,4]])
b_asarray = np.asarray(b)
Matplotlib, pyplot and pylab关系
matplotlib是完整的包,pyplot是里面一个模块,用来自动画图,pylab是和matplotlib一起下载安装的模块(我觉得意思是pylab不属于matplotlib包)
举了一个plot的栗子
import numpy as np
import matplotlib.pyplot as plt
'''
Help on function linspace in module numpy:
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
Return evenly spaced numbers over a specified interval.
Returns `num` evenly spaced samples, calculated over the
interval [`start`, `stop`].
前面三个参数较好理解,endpoint=True意味包含结尾,
举例如下
>>> np.linspace(2.0, 3.0, num=5)
array([ 2. , 2.25, 2.5 , 2.75, 3. ])
>>> np.linspace(2.0, 3.0, num=5, endpoint=False)
array([ 2. , 2.2, 2.4, 2.6, 2.8])
retstep参数选择是否返回间隔值
>>> np.linspace(2.0, 3.0, num=5, retstep=True)
(array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
'''
#从0-2,均匀的取100个值(也就是每隔0.02取一个值)
x = np.linspace(0, 2, 100)
#x,y,label标签
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')
#设置x/y轴的标签
plt.xlabel('x label')
plt.ylabel('y label')
#标题
plt.title("Simple Plot")
#设置的是左上角的那个标注,默认是都和label一样,所以不用再设置了
plt.legend()
plt.show()
图像如下
Pylab是一个模块,他的作用是把matplotlib和numpy两个包导入到同一个命名空间,官方文档强烈建议不要使用pylab,用pyplot代替
这里还有一个神奇的小插曲。。。
我导入的时候会提示:
AttributeError: module ‘matplotlib’ has no attribute 'pyplot’
差点骗的我把matplotlib重装,然后发现是我自己在桌面上建了一个matplotlib.py文件,python import的时候先找到了我放在桌面上的文件
承包今天的笑点23333
编码风格建议
1.开头一般是这样导入
import matplotlib.pyplot as plt
import numpy as np
2.为啥不像MATLAB一样,直接用全局状态、平面命名空间?
优势是学术性的,可以风格更明确,更清楚的表达出事物的来源和发展,尤其对于复杂的程序,可以使程序更容易编写和维护
3.会遇到数据集不同,但是画相同、类似图的情况,因此建议编写专门的函数来绘图
eg:
def my_plotter(ax, data1, data2, param_dict):
"""
A helper function to make a graph
Parameters
----------
ax : Axes
The axes to draw to
data1 : array
The x dat
data2 : array
The y data
param_dict : dict
Dictionary of kwargs to pass to ax.plot
Returns
-------
out : list
list of artists added
"""
out = ax.plot(data1, data2, **param_dict)
return out
# which you would then use as:
data1, data2, data3, data4 = np.random.randn(4, 100)
fig, ax = plt.subplots(1, 1)
my_plotter(ax, data1, data2, {'marker': 'x'})
当遇到复杂(多图)的情况时就很有用
只需要少量修改(修改函数外的东西)
fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})
后面的东西都偏理论一点 ,只稍微提一下,具体都不展开了,毕竟学习matplotlib的目的是作图
Backends:后端
针对不同的用例(使用方式)和输出格式,完成后台的绘制图形的工作
比方说我计划是学习matplotlib来做python的机器学习,其他人可能是做web应用服务器绘图,而我们都不需要知道,ok,图是具体怎么画的
Backends分交互式后端和非交互式后端
后面介绍了怎么配置,我这里暂时用不到,就不翻了
对我有用的结论,交互后端自动显示图像,非交互的,调用个show()函数就ojbk了
然后是渲染问题:
用了几种方法来减少渲染时间,但是绘图外观会受到影响
后面的巴拉巴拉的介绍,暂时都用不到了,就先到这里