笔记,数据(1)

简单的例子,参考:http://www.cnblogs.com/Frandy/archive/2012/09/17/python_pyplot_1.html

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

t=np.linspace(0,5,100)#创建等差矩阵
x=np.sin(t)
plt.figure() #创建图板
plt.plot(t,x,linewidth=3)
plt.plot(t[::2],signal.resample(x,50),'ko') #与MATLAB的画图类似,plot除了需要x,y这两个参数,还可以有其他参数,比如,指定线的样式,可以是虚线,点线,还有颜色,线的宽度,这些可以使用关键字参数指定。
plt.show() #显示图形
print(t.shape,t.dtype) #显示矩阵的维度和数据类型

def fu(i,j):
    return (i+1)*(j+1)
print(np.fromfunction(fu,(9,8))) #双层循环的函数运算,比如乘法表制作

结果:




关于标注和标题
由于只是一幅图,比较好指定,plt.xlabel(text),plt.ylabel(text),plt.title(text),还可以制定字体大小,使用关键字参数fontsize=16,补充一点就是公式的输入,它支持latex格式的公式输入,就是两个$中间写latex的公式,保证字符串是raw格式,这个还是很好用的。有一个在线的latex公式编辑测试,很好用的,给出链接,http://www.codecogs.com/latex/eqneditor.php


关于坐标轴范围,通过plt.axis([xmin xmax ymin ymax]指定,关于网格,plt.grid(True),就可以显示网格。关于图例,如果在画曲线的时候制定了label,那么图例也是很简单的,plt.legend()就可以了。在matplotlib里面。有专门的一个legend的类,还很复杂的,暂时不深究了。关于画多条曲线,在matlab里面要使用hold on,这个好像不需要,直接继续plt.plot(x,y)就可以了。

 

 

 

  完整的例子:

import numpy as np
import matplotlib.pyplot as plt

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

def f2(t):
    return np.sin(2*np.pi*t)*np.cos(3*np.pi*t)

t = np.arange(0.0,5.0,0.02)

plt.figure() plt.plot(t,f1(t),
"g-",label="$f(t)=e^{-t} \cdot \cos (2 \pi t)$") plt.plot(t,f2(t),"r-.",label="$g(t)=\sin (2 \pi t) \cos (3 \pi t)$",linewidth=2) plt.axis([0.0,5.01,-1.0,1.5]) plt.xlabel("t") plt.ylabel("v") plt.title("a simple example") plt.grid(True) plt.legend() plt.show()

结果:

 

 

 

  多图输出,参考:http://www.cnblogs.com/Frandy/archive/2012/09/27/python_pyplot_subplot.html
#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

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

def f2(t):
    return np.sin(2*np.pi*t)*np.cos(3*np.pi*t)

t = np.arange(0.0,5.0,0.02) #设定x和y轴的范围

plt.figure(figsize=(8,7),dpi=98) #设置画布大小和dpi(dots per inch,该值越大,表明打印机的打印精度越高)
p1 = plt.subplot(211)
p2 = plt.subplot(212) #p1 = plt.subplot(211) 或者 p1 = plt.subplot(2,1,1), 表示创建一个2行,1列的图,p1为第一个子图,

p1.plot(t,f1(t),"g-",label="$f(t)=e^{-t} \cdot \cos (2 \pi t)$") #注意转义符号 \
p2.plot(t,f2(t),"r-.",linewidth=2)

p1.axis([0.0,5.01,-1.0,1.5])

p1.set_ylabel("v",fontsize=14)
p1.set_title("A simple example",fontsize=18)
p1.grid(True)
p1.legend()

p2.axis([0.0,5.01,-1.0,1.5])
p2.set_ylabel("v",fontsize=14)
p2.set_xlabel("t",fontsize=14)
p2.legend()

tx = 2
ty = 0.9
p2.text(tx,ty,"$g(t)=\sin (2 \pi t) \cos (3 \pi t)$",fontsize=15,verticalalignment="bottom",horizontalalignment="left") #指定位置文本,tx和ty指定放置文字的位置,va和ha指定对其方式,可以是top,bottom,center或者left,right,center,还可以使文字带有边框,边框形状还可以是箭头,并指定方向。
p2.annotate('',xy=(1.8,0.5),xytext=(tx,ty),arrowprops=dict(arrowstyle="->",connectionstyle="arc3")) #指定位置箭头,text是与箭头一起的文字,xy是箭头所在位置,终点,xytext是起点,arrowtypes指定箭头的样式
plt.show()

结果:


与pyplot相同的是,可以直接使用pyplot画图,添加label,等,也可以是使用p1来做这些事情。
与pyplot不同的是,有一些函数的名字不太一样,添加坐标轴的标注的函数为set_xlabel和set_ylabel,
添加标题set_title,只是给子图添加标题,由于pyplot是一个有状态的对象,所以pyplot.title也是给当前子图添加标题,
如果要给整个图添加标题,可以使用pyplot.suptitle(text)。




  局部放大图(好像很高大上),参考:http://www.cnblogs.com/Frandy/archive/2012/09/28/python_pyplot_zoom.html
#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch

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

def f11(t):
    return np.exp(-t)*np.cos(2*np.pi*t+0.2)

def f111(t):
    return np.exp(-t+0.2)*np.cos(2*np.pi*t)

t = np.arange(0.0,5.0,0.02)

plt.figure(figsize=(16,8),dpi=98)
p1 = plt.subplot(121,aspect=5/2.5)
p2 = plt.subplot(122,aspect=0.5/0.05)

label_f0 = r"$f(t)=e^{-t+\alpha} \cos (2 \pi t+\beta)$"
label_f1 = r"$\alpha=0,\beta=0$"
label_f11 = r"$\alpha=0,\beta=0.2$"
label_f111 = r"$\alpha=0.2,\beta=0$"

p1.plot(t,f1(t),"g",label=label_f1,linewidth=2)
p1.plot(t,f11(t),"r-.",label=label_f11,linewidth=2)
p1.plot(t,f111(t),"b:",label=label_f111,linewidth=2)
p2.plot(t,f1(t),"g",label=label_f1,linewidth=2)
p2.plot(t,f11(t),"r-.",label=label_f11,linewidth=2)
p2.plot(t,f111(t),"b:",label=label_f111,linewidth=2)

p1.axis([0.0,5.01,-1.0,1.5])

p1.set_ylabel("v",fontsize=14)
p1.set_xlabel("t",fontsize=14)
#p1.set_title("A simple example",fontsize=18)
p1.grid(True)
p1.legend()

tx = 0.5
ty = 0.9
p1.text(tx,ty,label_f0,fontsize=15,verticalalignment="top",horizontalalignment="left")

p2.axis([4,4.5,-0.02,0.03])
p2.set_ylabel("v",fontsize=14)
p2.set_xlabel("t",fontsize=14)
p2.grid(True)
p2.legend()

# plot the box
tx0 = 4
tx1 = 4.5
ty0 = -0.1
ty1 = 0.1
sx = [tx0,tx1,tx1,tx0,tx0]
sy = [ty0,ty0,ty1,ty1,ty0]
p1.plot(sx,sy,"purple")

# plot patch lines
xy=(4.45,0.09)
xy2 = (4.02,0.026)
con = ConnectionPatch(xyA=xy2,xyB=xy,coordsA="data",coordsB="data",
        axesA=p2,axesB=p1)
p2.add_artist(con)

xy = (4.45,-0.09)
xy2 = (4.02,-0.018)
con = ConnectionPatch(xyA=xy2,xyB=xy,coordsA="data",coordsB="data",
        axesA=p2,axesB=p1)
p2.add_artist(con)

plt.show()

结果:

 

这里主要介绍如何画方框和两条线。
画方框,使用了画连接方框四个顶点的四条线段就可以了,从某个点绕个圈再回到起点,就画出了方框,使用pyplot(x,y),还可以方便地指定颜色,线宽等。
然后是画跨子图的线,这里使用连接线,在matplotlib.patches有一个ConnectionPatch类型,就是用的这个,它可以用在一个或多个子图之间画线,annotate好像只能在一个子图里面画箭头,应该可以没有箭头,那就是一条线了,与connectionPatch效果相同。
con = ConnectionPatch(xyA=xy1,xyB=xy0,coordsA="data",coordsB="data",
axesA=p1,axesB=p0)
p1.add_artist(con)
这里xyA是p1里面的点,xy0是p0里面的点,coordsA和coordsB默认值"data",也不用改,然后就是axesA,要添加ConnectionPatch的子图,axesB,要连接的子图。需要注意的是,ConnectionPatch,是一种会覆盖的画图操作,好象是这个意思吧,不需要继续用了,也没有深究下去的动力了。
最后使用p1.add_artist(con),将连接线添加进子图。


另外要提醒一下的是,在使用公式文本的时候,需要使用raw字符串,有时候不使用r"text"没有问题,但有时候用到\的时候就需要使用r"text"来指明是raw字符串了,比如输入r"\alpha",如果不使用r说明是raw字符串,就会出问题了。

 

关于scipy的延伸阅读:http://blog.chinaunix.net/uid-21633169-id-4437868.html

posted @ 2016-10-24 17:03  CC_python  阅读(182)  评论(0)    收藏  举报