您的位置:首页 > 编程语言 > PHP开发

networkx使用笔记(三)之好汉篇Matplotlib(4)

2012-07-26 16:46 330 查看

0.Matplotlib小记

Matplotlib的笔记一直拖着,最近发现自己从图书馆借来的书要到期了,还是做个笔记,免得到时候要查阅又麻烦了。

import matplotlib.pyplot as plt

默认情况下,画出来的是点连成的线,针对点和线,其区分的一个较为容易的是格式的设置。

1.点和线的设置

形:

对于线来说包括:'-' 直线; ‘- -’虚线(其中中间没空格,这里为了好区分加的); ‘-.’虚线加点 ; ':'点式直线(这个记不清了)

对于点来说:‘.’小点儿 ; ‘,’ 点的形状是像素点;‘o’点是圆形的;‘v’上三角 ;‘^’下三角;‘s’方形;‘p’五角星;‘*’星形;‘+’加号;‘|’竖线;‘—’横线

色:

颜色有:‘b’--blue ‘g’--green ‘r’--red 'c'--cyan 'k'--black

2.设置x和y轴的坐标范围

plt.xlim(x1,x2)

plt.ylim(y1,y2)

plt.grid(True)//网格线

xlim和ylim设定了范围,而ax=plt.gca()之后通过ax可以设定主刻度和副刻度ax.xaxis.set_major_locotor(MultipleLocator(float)) ...set_minor_locator(y轴上的修改为y即可);除了刻度,x轴和y轴上对于同一个区间,例如0.1,可能长度不同,即axes per unit length可能不等,这时需要一句话搞定ax.set_aspect("equal")

3.图中的小图划分

对于每个图figure,可以显示多个plot,plt.subplot()可以对画布figure进行划分,例如plt.subplot(211)将画布分为了2行1列共2个区域。

可以利用plt.sca()进行subplot切换;利用plt.savefig()中的dpi属性设置其像素;利用plt.rc('font', size=8)设置全局字体大小为8;可以利用plt.xlabel()设置fontsize来设置subplot中x轴下方的字体大小

以例子:

'''这里定义了四个subplot,第一个命名为ax1,第二个为ax2....'''
ax1=plt.subplot(221)
ax2=plt.subplot(222)
ax3=plt.subplot(223)
ax4=plt.subplot(224)
plt.sca(ax1)'''可以通过plt.sca()进行subplot的切换'''
tt=plt.plot(xins,yins,'b--',xin,yin,'r-')
plt.xlabel('indegree, r=0.6, t=5')
plt.ylabel('The CDD of indegree')
plt.legend(tt,['original','curve'],numpoints=1)
plt.sca(ax2)
tt=plt.plot(xouts,youts,'b--',xout,yout,'r-')
plt.xlabel('outdegree, r=0.6, t=5')
plt.ylabel('The CDD of outdegree')
plt.legend(tt,['original','curve'],numpoints=1)
plt.sca(ax3)
tt=plt.plot(xins1,yins1,'b--',xin,yin,'r-')
plt.xlabel('indegree, r=0.6, t=5')
plt.ylabel('The CDD of indegree')
plt.legend(tt,['original','curve'],numpoints=1)
plt.sca(ax4)
tt=plt.plot(xouts1,youts1,'b--',xout,yout,'r-')
plt.xlabel('outdegree, r=0.6, t=5')
plt.ylabel('The CDD of outdegree')
plt.legend(tt,['original','curve'],numpoints=1)
plt.savefig('F:/expriment/random_walk/gpn08_'+'6'+'_5'+'.png',dpi=600)


4.一些标注

可以在右上角加上曲线或点的标注,语句:plt.plot(x,y,label="....")

此时需要执行plt.lengend()语句才能显示,当然执行legend操作的时候可以不带任何参数,也可以修改一些参数

5. 实例

借助之前的curve_fit,将点和与之拟合的曲线画出来

def func(x,a,b):
return (b-a/np.log(x))


def power_law():
xnodes=np.array([1098,1715,3330,8913,9638,14012,15632,24920,25852,35993,41213],dtype=float)
ylaw=np.array([4.96858,4.65149,4.28484,3.32612,3.35046,3.32751,3.219,3.012,2.90853,2.76331,2.71217],dtype=float)
'''这里对a和b的初始值进行了假设,应该是通过梯度下降的方法来计算拟合的a和b值的,初始值对最终拟合结果有影响'''
y0=func(xnodes,16.667,2)
popt,pcov=curve_fit(func,xnodes,ylaw)
x=np.arange(xnodes[0],xnodes[10],1000)
a,b=float(popt[0]),float(popt[1])
tt=plt.plot(xnodes,ylaw,'b+',x,func(x,a,b),color='blue')
'''原来的点是用蓝色和+形来描绘的,通过拟合得到的则是蓝色的曲线了,因为默认情况下是描绘曲线的'''
plt.legend(tt,['origin_data','fitting_curve'],numpoints=1)
'''这里通过设置tt的属性,使得在图像的右上角显示了注释,默认的numpoints为2,改为2试一下就知道是啥情况了~~'''
plt.show()
return a,b
这里,直接把数据存储了,然后进行拟合和画线。

结果如下



其实,在进行幂律拟合的时候,拟合程度是有判定的,建议去看看这篇文章Power-law distributions in empirical data(里面有一个工具plfit,可以计算log似然估计fit值和kolmogorov-Smirnov fit值,比俺用networkx进行拟合的这小例子cool多了),继续探索,会发现老外提供了更强的的程序包(斯坦福大学的SNAP也不错),话说国内做复杂网络相关的好像只会说被人有个啥,自己用啥从来不说。

为啥人家老外啥都公开,包括数据集和程序库,咱国内不仅水平低还关门造车,让学术不外传,open不够啊,这真像古代秦晋时候的贵族豪门。

参考资料:

http://hyry.dip.jp:8000/pydoc/matplotlib_intro.html

http://flyfeeling.blogbus.com/logs/53148228.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: