本文共 5638 字,大约阅读时间需要 18 分钟。
Matplotlib plot函数是一个命令行风格的函数集合,使matplotlib像MATLAB一样工作。每个plot函数会对图形窗口(figure)做一些改变,例如:创建一个图形窗口、在图形窗口上创建一个绘图区(plotting area)、在绘图区上画一些线条、在线条上标注说明文字等等。在中,通过函数调用保留不同的状态,这样就可以对当前图形(figure)和绘图区(plotting area)保持跟踪,并且当前绘制函数(plotting functions)被导向到当前坐标系(请注意这里的“坐标”,在文档中的大多数地方,指的是图形窗口的坐标部分,而非严格意义上的数学术语)
你可能感到奇怪,为什么x轴的范围是多0到3而y轴是从1到4。如果你只给命令提供了一个列表或数组参数,matplotlib认为它是一个y值的序列,然后自动生成x值。因为Python的序列范围从0开始,所以默认的x向量与y向量有相同的长度,但是x从0开始。因此,x的值是[0,1,2,3]。
plot()是个通用【或万能的】(versatile command)的命令,它有一个可变数量的参数。例如,绘制x和y,你可以发出以下命令:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
对于每一对x和y参数,有一个第三个参数可以设置图的颜色和线型。字母和符号的字符串格式来自MATLAB,颜色字母与线型字符紧贴。默认的字符串格式为“b-”,这是一条实心蓝色线。例如,要用红色圆点绘制上图,你要使用以下命令:
plt.plot([1,2,3,4], [1,4,9,16], 'ro')
如果matplotlib只限于使用list工作,那它对于数据处理就没什么价值了。一般来讲,你会使用numpy数组。事实上,所有序列(sequence)都会在内部转为numpy数组。下面的例子展示了在一条命令中使用数组用不同的格式绘制多条线条。
import numpy as npimport matplotlib.pyplot as plt# 偶然采样时间在200ms间隔上t = np.arange(0., 5., 0.2)# 红色虚线,蓝色方块和绿色三角plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')plt.show()
Lines有很多属性可以设置:线宽度、线条样式、抗锯齿等等。点击查看详细。有很多方法可以设置线的属性:
lines = plt.plot(x1, y1, x2, y2)# 使用关键字 argsplt.setp(lines, color='r', linewidth=2.0)# 或使用 MATLAB风格的字符串值对plt.setp(lines, 'color', 'r', 'linewidth', 2.0)下面是Line2D的有效属性:
| Property | Value Type |
| alpha | float |
| animated | [True | False] |
| antialiased or aa | [True | False] |
| clip_box | a matplotlib.transform.Bbox instance |
| clip_on | [True | False] |
| clip_path | a Path instance and a Transform instance, a Patch |
| color or c | any matplotlib color |
| contains | the hit testing function |
| dash_capstyle | ['butt' | 'round' | 'projecting] |
| dash_joinstyle | ['miter' | 'round' | 'bevel] |
| dashes | sequence of on/off ink in points |
| data | (np.array xdata, np.array ydata) |
| figure | a matplotlib.figure.Figure instance |
| label | any string |
| linestyle or ls | ['-' | '--' | '-.' | ':' | 'steps' | ...] |
| linewidth or lw | float value in points |
| lod | [True | False] |
| marker | ['+' | ',' | '.' | '1' | '2' | '3' | '4'] |
| markeredgecolor or mec | any matplotlib color |
| markeredgewidth or mew | float value in points |
| markerfacecolor or mfc | any matplotlib color |
| markersize or ms | float |
| markevery | [ None | integer | (startind, stride) ] |
| picker | used in interactive line selection |
| pickradius | the line pick selection radius |
| solid_capstyle | ['butt' | 'round' | 'projecting] |
| solid_joinstyle | ['miter' | 'round' | 'bevel] |
| transform | a matplotlib.transforms.Transform instance |
| visible | [True | False] |
| xdata | np.array |
| ydata | np.array |
| zorder | any number |
调用函数,以一条或多条线图作为参数传入,即可获得一个可设置的线图属性列表:In [69]: lines = plt.plot([1, 2, 3])In [70]: plt.setp(lines)alpha: float animated: [True | False] antialiased or aa: [True | False] ...snip
工作在多个图形和坐标上
MATLAB和,有当前图形和坐标的概念。所有绘制命令都是对当前坐标进行操作。函数返回当前坐标系(一个实例),返回当前图形。通常你不必担心,因为它是幕后工作。下面是创建两个子图的脚本:import numpy as npimport matplotlib.pyplot as plt
def f(t):return np.exp(-t) * np.cos(2np.pit)
t1 = np.arange(0.0, 5.0, 0.1)t2 = np.arange(0.0, 5.0, 0.02)
plt.figure(1)plt.subplot(211)plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')plt.subplot(212)plt.plot(t2, np.cos(2np.pit2), 'r--')plt.show()
你可以创建多个图形通过多次调用函数。当然,每个图形都可以包含你期望的图形和坐标:import matplotlib.pyplot as plt
plt.figure(1)plt.subplot(211)plt.plot([1, 2, 3])plt.subplot(212)plt.plot([4, 5, 6])
plt.figure(2)plt.plot([4, 5, 6])
plt.figure(1)plt.subplot(212)plt.title('Easy as 1, 2, 3')
你可以清除当前图形和坐标:plt.close()plt.close()
如果你正在制作多个图形,你需要意识到一个事实:如果不明确调用函数来关闭图形,那么图形所占内存就不会被完全释放。删除所有对图形的引用,或者使用windows的任务管理器杀掉显示在屏幕上的图形窗口,这些都不够,因为pyplot保持了内部的引用,直到调用显式关闭。
操作文本
可以使用plot命令在任意位置添加文本。例如:import numpy as npimport matplotlib.pyplot as plt
Fixing random state for reproducibilitynp.random.seed(19680801)
mu, sigma = 100, 15x = mu + sigma * np.random.randn(10000)
the histogram of the datan, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)plt.xlabel('Smarts')plt.ylabel('Probability')plt.title('Histogram of IQ')plt.text(60, 0.025, r'$\mu=100,\ \sigma=15$')plt.axis([40, 160, 0, 0.03])plt.grid(True)plt.show()
所有的plot命令都会返回一个实例。正像上图所示,你可以通过向文本函数传入参数或使用setp函数,来定制属性:t = plt.xlabel('my data', fontsize=14, color='red')
在文本中使用数学表达式:plt.title(r'$\sigma_i=15$')
Matplotlib可以在任何文本表达式中接受TeX等式。例如,在标题中写:plt.title(r'$\sigma_i=15$')
在绘图时添加文本注释:import numpy as npimport matplotlib.pyplot as plt
ax = plt.subplot(111)t = np.arange(0.0, 5.0, 0.01)s = np.cos(2np.pit)line, = plt.plot(t, s, lw=2)plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),arrowprops=dict(facecolor='black', shrink=0.05),)plt.ylim(-2, 2)plt.show()
对数和其它非线性坐标支持:plt.xscale('log')
下面是对于y轴的相同数据不同尺度(scales)的四个绘图:import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.ticker import NullFormatter
Fixing random state for reproducibilitynp.random.seed(19680801)
make up some data in the interval ]0, 1[y = np.random.normal(loc=0.5, scale=0.4, size=1000)y = y[(y > 0) & (y < 1)]y.sort()x = np.arange(len(y))
plt.figure(1)plt.subplot(221)plt.plot(x, y)plt.yscale('linear')plt.title('linear')plt.grid(True)
plt.subplot(222)plt.plot(x, y)plt.yscale('log')plt.title('log')plt.grid(True)
plt.subplot(223)plt.plot(x, y - y.mean())plt.yscale('symlog', linthreshy=0.01)plt.title('symlog')plt.grid(True)
plt.subplot(224)plt.plot(x, y)plt.yscale('logit')plt.title('logit')plt.grid(True)
Format the minor tick labels of the y-axis into empty strings withNullFormatter,避免太多显示标签plt.gca().yaxis.set_minor_formatter(NullFormatter())
Adjust the subplot layout,因为logit图形会比普通图形占更多的空间plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25, wspace=0.35)
plt.show()
转载地址:http://ibafk.baihongyu.com/