我是入门的新手,打算先学习一下python的三大库:numpy,matplotlib,pandas。打算先从官方文档开始学起。下面是matplotlib官方文档的教程部分,本文从第一部分介绍讲起:
第1章 使用指南(Usage Guide)
图的各部分(Parts of a Figure)
这幅图包括了绘图的所有要素。整张图称为figure,创建它很简单:
生成一个绘图窗口(figure)的方法:
fig1 = plt.figure()
注意区分 axes、axis、artist的概念:
- axes是轴的集合,功能类似于subplot。
- axis是具体的某个轴(x轴、y轴)
- artist 如上图所示,可以指figure中的所有东西
Basically everything you can see on the figure is an artist (even the Figure, Axes, and Axis objects). This includes Text objects, Line2D objects, collection objects, Patch objects … (you get the idea).
绘图功能需要的参数类型(Types of inputs to plotting functions)
所有的绘图函数都需要np.array 或者 np.ma.masked_array来作为输入。
如果不是,则需要调用函数进行转换。
b = np.matrix([[1,2],[3,4]])
b_asarray = np.asarray(b)
区别 Matplotlib, pyplot 和 pylab
Matplotlib是指整个库 ,而 matplotlib.pyplot 是Matplotlib中的一个module.
pylab是一个很方便的模块,它同时把matplotlib.pyplot和numpy搬运到了同一个命名空间(namespace)里。pylab已过时,并且由于命名空间污染而强烈不建议使用pylab。使用pyplot代替。
编码风格(Coding Styles)
对于pyplot样式,脚本顶部的导入通常为:
import matplotlib.pyplot as plt
import numpy as np
然后调用函数,例如,np.arange,np.zeros,np.pi,plt.figure,plt.plot,plt.show等。使用pyplot接口创建图形,然后使用对象方法进行其余操作:
x = np.arange(0, 10, 0.2)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()
绘出的图形如下:
如果你要为不同的数据集一次次绘制相同的图,那么可以使用下面这个函数:
def my_plotter(ax, data1, data2, param_dict):
"""
Parameters
----------
ax : Axes
The axes to draw to
(需要画的图)
data1 : array
The x data
data2 : array
The y data
param_dict : dict
Dictionary of kwargs to pass to ax.plot
一些字典类型的参数去配置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.subplot(1 , 2 )
my_plotter (ax1 , data1 , data2 , {'maker':'x'} )
my_plotter (ax2 , data3 , data4 , {'maker':'o'} )
后端(backends)
–略
交互式与非交互式(interactive mode)
交互式可以输入一行命令之后,实时的绘制图像。而非交互式需要设置完图像参数后,输入plt.show()才将图像绘制出来。
开启交互模式的命令:matplotlib.pyplot.ion()
关闭交互模式的命令:matplotlib.pyplot.ioff()
import matplotlib.pyplot as plt
plt.ion()
plt.plot([1.6, 2.7])
例如同样运行下面的代码,如果是交互模式,则会实时显示图像,如果是非交互模式,则不会发生任何事,除非加上plt.show()
性能(Performance)
线段简化(Line segment simplification)
对于具有线段的图(例如,典型的线图,多边形的轮廓等),可以通过文件中的path.simplify和 path.simplify_threshold参数 控制渲染性能。
该path.simplify参数是一个布尔值,指示是否完全简化了线段。
该 path.simplify_threshold参数控制简化的线段数量。阈值越高,渲染越快。
以下脚本将首先显示数据而不进行任何简化,然后以简化方式显示相同的数据。尝试与他们两个进行交互:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.logspace(1, np.log10(50000), 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['path.simplify_threshold'] = 0.0
plt.plot(y)
plt.show()
mpl.rcParams['path.simplify_threshold'] = 1.0
plt.plot(y)
plt.show()
标记简化(Marker simplification)
标记简化仅适用于Line2D对象(通过 markevery属性)。
plt.plot(x, y, markevery=10)
将行分成较小的块(Splitting lines into smaller chunks)
如果使用的是Agg后端则可以使用agg.path.chunksizerc参数。这使您可以指定块的大小,任何大于多个顶点的线都将被拆分为多条线,每条线的agg.path.chunksize 顶点数不超过多个。(除非agg.path.chunksize为零,否则将不进行分块。)对于某些类型的数据,将行分块为合理的大小可以大大减少渲染时间。
以下脚本将首先显示没有任何块大小限制的数据,然后显示块大小为10,000的相同数据。当数字很大时,最好看到这种差异,请尝试最大化GUI并与之交互:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['path.simplify_threshold'] = 1.0
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.logspace(1,np.log10(50000), 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['agg.path.chunksize'] = 0
plt.plot(y)
plt.show()
mpl.rcParams['agg.path.chunksize'] = 10000
plt.plot(y)
plt.show()
图例(legends)
轴的默认图例行为会尝试查找覆盖最少数据点(loc=‘best’)的位置。如果有很多数据点,这可能是非常昂贵的计算。在这种情况下,你可能需要提供一个特定的位置。
使用fast样式
该fast样式可用于自动设置简化和拆分参数合理设置,以加快绘制大量的数据。只需运行以下命令即可使用它:
import matplotlib.style as mplstyle
mplstyle.use('fast')
它的重量很轻,因此可以与其他样式很好地配合,只要确保最后应用快速样式即可,这样其他样式就不会覆盖设置:
mplstyle.use(['dark_background', 'ggplot', 'fast'])
可以参考一下这篇博客理解:浅谈在matplotlib中更改plt.plot()的绘图风格