数据分析初始阶段,一般都要进行可视化处理。数据可视化旨在直观展现信息的分析结果和构思,令某些抽象数据具象化,这些抽象数据包括数据测量单位的性质或数量。本章用的程序库matplotlib是创建在Numpy之上的一个Python图库,它提供了一个面向对象的API和一个过程式类的MATLAB
API,他们能够并行使用。本文涉及的主题有:python
代码:api
import matplotlib.pyplot as plt import numpy as np x=np.linspace(0,20) #linspace()函数指定横坐标范围 plt.plot(x,.5+x) plt.plot(x,1+2*x,'--') plt.show() [/code] 运行结果:  ![]() 经过show函数将图形显示在屏幕上,也能够用savefig()函数把图形保存到文件中。 ## 二、对数图 所谓对数图,实际上就是使用对数坐标绘制的图形。对于对数刻度来讲,其间隔表示的是变量的值在数量级上的变化,这与线性刻度有很大的不一样。对数图又分为两种不一样的类型,其中一种称为双对数图,它的特色是两个坐标轴都采用对数刻度,对应的matplotlibh函数是matplotlib.pyplot..loglog()。半对数图的一个坐标轴采用线性刻度,另外一个坐标轴使用对数刻度,它对应的matplotlib API是semilogx()函数和semilogy()函数,在双对数图上,幂律表现为直线;在半对数图上,直线则表明的是指数律。 摩尔定律大意为集成电路上晶体管的数量每两年增长一倍。在https://en.wikipedia.org/wiki/Transistor_count#Microprocessors页面有一个数据表,记录了不一样年份微处理器上晶体管的数量。咱们为这些数据制做一个CSV文件,名为transcount.csv,其中只包含晶体管数量和年份值。 代码: ```code import matplotlib.pyplot as plt import numpy as np import pandas as pd df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) #按年份分组,以数量均值聚合 #print grouped.mean() years=df.index.values #获得全部年份信息 counts=df['trans_count'].values #print counts poly=np.polyfit(years,np.log(counts),deg=1) #线性拟合数据 print "poly:",poly plt.semilogy(years,counts,'o') plt.semilogy(years,np.exp(np.polyval(poly,years))) #polyval用于对多项式进行评估 plt.show() #print df #df=df.groupby('year').aggregate(np.mean) [/code] 运行结果:  ![]() 实线表示的是趋势线,实心圆表示的是数据点。 ## 三、散点图 散点图能够形象展现直角坐标系中两个变量之间的关系,每一个数据点的位置实际上就是两个变量的值。泡式图是对散点图的一种扩展。在泡式图中,每一个数据点都被一个气泡所包围,它由此得名;而第三个变量的值正好能够用来肯定气泡的相对大小。 在https://en.wikipedia.org/wiki/Transistor_count#GPU页面上,有个记录GPU晶体数量的数据表,咱们用这些晶体管数量年份数据新建表gpu_transcount.csv。借助matplotlib API提供的scatter()函数绘制散点图。 代码: ```code import matplotlib.pyplot as plt import numpy as np import pandas as pd df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) gpu=pd.read_csv('H:\Python\data\\gpu_transcount.csv') gpu=gpu.groupby('year').aggregate(np.mean) df=pd.merge(df,gpu,how='outer',left_index=True,right_index=True) df=df.replace(np.nan,0) print df years=df.index.values counts=df['trans_count'].values gpu_counts=df['gpu_counts'].values cnt_log=np.log(counts) plt.scatter(years,cnt_log,c=200*years,s=20+200*gpu_counts/gpu_counts.max(),alpha=0.5) #表示颜色,s表示标量或数组 plt.show() [/code] 运行结果 ```code trans_count gpu_counts year 1971 2300 0.000000e+00 1972 3500 0.000000e+00 1974 5400 0.000000e+00 1975 3510 0.000000e+00 1976 7500 0.000000e+00 1978 19000 0.000000e+00 1979 48500 0.000000e+00 1981 11500 0.000000e+00 1982 94500 0.000000e+00 1983 22000 0.000000e+00 1984 190000 0.000000e+00 1985 105333 0.000000e+00 1986 30000 0.000000e+00 1987 413000 0.000000e+00 1988 215000 0.000000e+00 1989 745117 0.000000e+00 1990 1200000 0.000000e+00 1991 692500 0.000000e+00 1993 3100000 0.000000e+00 1994 1539488 0.000000e+00 1995 4000000 0.000000e+00 1996 4300000 0.000000e+00 1997 8150000 3.500000e+06 1998 7500000 0.000000e+00 1999 16062200 1.533333e+07 2000 31500000 2.500000e+07 2001 45000000 5.850000e+07 2002 137500000 8.500000e+07 2003 190066666 1.260000e+08 2004 352000000 1.910000e+08 2005 198500000 3.120000e+08 2006 555600000 5.325000e+08 2007 371600000 4.882500e+08 2008 733200000 7.166000e+08 2009 904000000 9.155000e+08 2010 1511666666 1.804143e+09 2011 2010000000 1.370952e+09 2012 2160625000 3.121667e+09 2013 3015000000 3.140000e+09 2014 3145000000 3.752500e+09 2015 4948000000 8.450000e+09 2016 4175000000 7.933333e+09 2017 9637500000 8.190000e+09 [/code] ![]()  ## 四、图例和注解 要想作出让人眼前一亮的神图,图例和注解确定是少不了的。通常状况下,数据图都带有下列辅助信息。 * 用来描述图中各数据序列的图例,matplotlib提供的legend()函数能够为每一个数据序列提供相应的标签。 * 对图中要点的注解。能够借助matplotlib提供的annotate()函数。 * 横轴和纵轴的标签,能够经过xlabel()和ylabel()绘制出来。 * 一个说明性质的标题,一般由matplotlib的title函数来提供. * 网格,对于轻松定位数据点很是有帮助。grid()函数能够用来决定是否使用网格。 代码: ```code import matplotlib.pyplot as plt import numpy as np import pandas as pd df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) gpu=pd.read_csv('H:\Python\data\\gpu_transcount.csv') gpu=gpu.groupby('year').aggregate(np.mean) df=pd.merge(df,gpu,how='outer',left_index=True,right_index=True) df=df.replace(np.nan,0) years=df.index.values counts=df['trans_count'].values gpu_counts=df['gpu_counts'].values #print df poly=np.polyfit(years,np.log(counts),deg=1) plt.plot(years,np.polyval(poly,years),label='Fit') gpu_start=gpu.index.values.min() y_ann=np.log(df.at[gpu_start,'trans_count']) ann_str="First GPU\n %d"%gpu_start plt.annotate(ann_str,xy=(gpu_start,y_ann),arrowprops=dict(arrowstyle="->"),xytext=(-30,+70),textcoords='offset points') cnt_log=np.log(counts) plt.scatter(years,cnt_log,c=200*years,s=20+200*gpu_counts/gpu_counts.max(),alpha=0.5,label="Scatter") #表示颜色,s表示标量或数组 plt.legend(loc="upper left") plt.grid() plt.xlabel("Year") plt.ylabel("Log Transistor Counts",fontsize=16) plt.title("Moore's Law & Transistor Counts") plt.show()
运行结果:数组
ide
Axes3D是由matplotlib提供的一个类,能够用来绘制三维图。经过讲解这个类的工做机制,就可以明白面向对象的matplotlib
API的原理了,matplotlib的Figure类是存放各类图像元素的顶级容器。函数
代码:工具
from mpl_toolkits.mplot3d.axes3d import Axes3D import matplotlib.pyplot as plt import numpy as np import pandas as pd df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) gpu=pd.read_csv('H:\Python\data\\gpu_transcount.csv') gpu=gpu.groupby('year').aggregate(np.mean) df=pd.merge(df,gpu,how='outer',left_index=True,right_index=True) df=df.replace(np.nan,0) fig=plt.figure() ax=Axes3D(fig) X=df.index.values Y=np.log(df['trans_count'].values) X,Y=np.meshgrid(X,Y) Z=np.log(df['gpu_counts'].values) ax.plot_surface(X,Y,Z) ax.set_xlabel('Year') ax.set_ylabel('Log CPU transistor counts') ax.set_zlabel('Log GPU transistor counts') ax.set_title('Moore Law & Transistor counts') plt.show() [/code] 运行结果:  ## 六、pandas绘图 pandas的Series类和DataFrame类中的plot()方法都封装了相关的matplotlib函数。若是不带任何参数,使用plot方法绘制图像以下: 代码: ```code import matplotlib.pyplot as plt import numpy as np import pandas as pd df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) gpu=pd.read_csv('H:\Python\data\\gpu_transcount.csv') gpu=gpu.groupby('year').aggregate(np.mean) df=pd.merge(df,gpu,how='outer',left_index=True,right_index=True) df=df.replace(np.nan,0) df.plot() df.plot(logy=True) #建立半对数图 df[df['gpu_counts']>0].plot(kind='scatter',x='trans_count',y='gpu_counts',loglog=True) #loglog=True 生成双对数 plt.show()
运行结果:网站
url
spa
.net
时滞图实际上就是一个散点图,只不过把时间序列的图像及相同序列在时间轴上后延图像放一块儿展现而已。例如,咱们能够利用这种图考察今年的CPU晶体管数量与上一年度CPU晶体管数量之间的相关性。能够利用pandas字库pandas.tools.plotting中的lag_plot()函数来绘制时滞图,滞默认为1。
代码:
import matplotlib.pyplot as plt import numpy as np import pandas as pd from pandas.tools.plotting import lag_plot df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) gpu=pd.read_csv('H:\Python\data\\gpu_transcount.csv') gpu=gpu.groupby('year').aggregate(np.mean) df=pd.merge(df,gpu,how='outer',left_index=True,right_index=True) df=df.replace(np.nan,0) lag_plot(np.log(df['trans_count'])) plt.show() [/code] 运行结果:  ## 八、自相关图 自相关图描述的是时间序列在不一样时间延迟状况下的自相关性。所谓自相关,就是一个时间序列与相同数据在不一样时间延迟状况下的相互关系。利用pandas子库pandas.tools.plotting 中的autocorrelation_plot()函数,就能够画出自相关图了。 代码: ```code import matplotlib.pyplot as plt import numpy as np import pandas as pd from pandas.tools.plotting import autocorrelation_plot df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) gpu=pd.read_csv('H:\Python\data\\gpu_transcount.csv') gpu=gpu.groupby('year').aggregate(np.mean) df=pd.merge(df,gpu,how='outer',left_index=True,right_index=True) df=df.replace(np.nan,0) autocorrelation_plot(np.log(df['trans_count'])) #绘制自相关图 plt.show() [/code] 运行结果:  从图中能够看出,较之于时间上越远(即时间延迟越大)的数值,当前的数值与时间上越接近(及时间延迟越小)的数值相关性越大;当时间延迟极大时,相关性为0; ## 九、Plot.ly Plot.ly其实是一个网站,它不只提供了许多数据可视化的在线工具,同时还提供了可在用户机器上使用的对应的python库。能够经过Web接口或以本地导入并分析数据,能够将分析结果公布到Plot.ly网站上。 安装plotly库:pip install plotly 先在plotly注册一个帐号,而后产生一个api_key。最后能够绘制箱形图。 代码: ```code import numpy as np import pandas as pd import plotly.plotly as py from plotly.graph_objs import * from getpass import getpass df=pd.read_csv('H:\Python\data\\transcount.csv') df=df.groupby('year').aggregate(np.mean) gpu=pd.read_csv('H:\Python\data\\gpu_transcount.csv') gpu=gpu.groupby('year').aggregate(np.mean) df=pd.merge(df,gpu,how='outer',left_index=True,right_index=True) df=df.replace(np.nan,0) api_key=getpass() py.sign_in(username='dengjiaxing',api_key='qPCrc5EA7unk9PlhNwLG') counts=np.log(df['trans_count'].values) gpu_counts=np.log(df['gpu_counts'].values) data=Data([Box(y=counts),Box(y=gpu_counts)]) plot_url=py.plot(data,filename='moore-law-scatter') print plot_url [/code] 运行结果: 