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