Matplotlib学习笔记(一)

在最开始接触python科学计算的时候,就知道了Matplotlib这个绘图库。个人是比较喜欢这种可视化的工具,照我看,GUI这种理念几乎是划时代的。如果说numpy是用来处理数据,那么Matplotlib就是用来展示数据的,抽象的数据,以图表的形式展示出来,无论是对自己,还是对看到的人,接受起来都比较轻松,也跟更容易发现数据内部隐藏着的某些规律性。

Matplotlib似乎是模仿的Matlab,Matlab没有接触过,但是Matplotlib是真的很好用,画出来的图都很优雅,可调整的参数也很多,并且刚开始学也不复杂,官网的帮助文档讲的也都很详细,深入的话当然还是有很多东西的。平常最常用的是pyplot模块,入手并不难,下面简单纪录下,顺便多说句,Matplotlib与numpy高度集成,转换的时候毫无滞碍。

文章参见这里:http://matplotlib.org/api/pyplot_api.html

Example1:

# -*- coding:utf-8 -*-

 

# 导入相关模块

import numpy as np

import matplotlib.pyplot as plt

 

x = np.arange(0, 5, 0.1) # 生成一个numpy数组对象

y = np.sin(x)

plt.plot(x, y) # 先是x坐标,后是y坐标

plt.show() # 没有这句就画不出图

 

这是最简单的,plot里的参数都是默认的。效果如下:

看起来是曲线,其实都是直线,只是因为点与点之间的距离很小,看起来比较平滑,plot默认会将点连接成线

Example2:

plt.plot([1, 2, 3, 4])

# 增加一个y轴的标签,pyplot模块本身提供了方法

plt.ylabel('some numbers')

plt.show()

这个地方,plot()只提供了一个参数,matplotlib默认是y的,那x的怎么办,matplotlib很聪明,它会自动生成一个,规律就是:从0开始,长度与y相同,效果就就是上图,可以发现,给坐标轴增加标签很简单

Example3:

plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro') # 多了个参数,自定义显示效果

# 增加图名、x和y轴的名字

plt.title('Dot')

plt.xlabel('x')

plt.ylabel('y')

# axis方法定义x轴和y轴的属性

plt.axis([0, 6, 0, 20])

plt.show()

Plot默认是蓝色实线,这里在plot里增加一个参数'ro',显示就变成红色圆点了,更多的效果参照下图。

Axis方法改变了坐标的属性,参数为[xmin, xmax, ymin, ymax]

Example4:

t = np.arange(0, 5, 0.2)

# plot可以同时接收多个参数

plt.plot(t, t, 'r--', t, t ** 2, 'bs', t, t ** 3, 'g^')

plt.show()

从这个例子中可以看到pyplot的灵活性,效果很多样,都可以自定义,还可以同时接受多个参数绘制在一张图表里

Example5:

x = np.arange(0, 5, 0.1)

# plot可以接受更多的参数

plt.plot(x, x, linewidth='2.0', color='green')

plt.show()

Matplotlib里有专门的Line2D对象,属性很多,远不止这两个,还得继续学习呢

http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D

Example6:

# 定义一个函数

def f(t):

return np.exp(-t) * np.cos(2*np.pi*t)

 

t1 = np.arange(0, 5, 0.1)

t2 = np.arange(0, 5, 0.02)

 

# 分块

plt.subplot(211)

plt.plot(t1, f(t1), 'bo')

 

plt.subplot(212)

plt.plot(t2, f(t2), 'r-')

 

plt.show()

分块显示,应用起来很实际。Subplot里的三位数字,第一个表示行数,第二个表示列数,第三个表示编号。数字相同的话,后面的图像会把前面的覆盖

Example7:

mu, sigma = 100, 15

x = mu + sigma * np.random.randn(10000)

# hist绘制直方图

n, bins, patches = plt.hist(x, 50, normed=1, alpha=0.75)

 

# text也是个有着复杂属性的对象

# matplotlib还可以自动转换成数学表达式

plt.text(60, 0.025, r'$\mu=100, \sigma=15$', fontsize='20')

plt.axis([40, 160, 0, 0.03])

plt.grid(True)

plt.show()

这个例子就复杂很多,其中有两点,一个是hist,另一个是text对象

可参照以下网址:http://matplotlib.org/users/mathtext.html#mathtext-tutorial

Example8:

t = np.arange(0, 5, 0.01)

s = np.cos(2 * np.pi * t)

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()

想画出这样的图自然没那么简单,参照:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.annotate

总结:以上所说,都是比较常用的,参数也相对简单,从这些例子中也能看到,看似简单的东西,背后往往复杂,要学的东西依然还有很多,加油吧。

posted @ 2016-08-23 21:41  plantree  阅读(3997)  评论(0编辑  收藏  举报