python数据分析(数据可视化)

时间:2023-02-01 03:53:31

数据分析初始阶段,通常都要进行可视化处理。数据可视化旨在直观展示信息的分析结果和构思,令某些抽象数据具象化,这些抽象数据包括数据测量单位的性质或数量。本章用的程序库matplotlib是建立在Numpy之上的一个Python图库,它提供了一个面向对象的API和一个过程式类的MATLAB API,他们可以并行使用。本文涉及的主题有:

  • matplotlib简单绘图
  • 对数图
  • 散点图
  • 图例和注解
  • 三维图
  • pandas绘图
  • 时滞图
  • 自相关图
  • Plot.ly

1、matplotlib绘图入门

代码:
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()

运行结果:
python数据分析(数据可视化)
python数据分析(数据可视化)
通过show函数将图形显示在屏幕上,也可以用savefig()函数把图形保存到文件中。

2、对数图

所谓对数图,实际上就是使用对数坐标绘制的图形。对于对数刻度来说,其间隔表示的是变量的值在数量级上的变化,这与线性刻度有很大的不同。对数图又分为两种不同的类型,其中一种称为双对数图,它的特点是两个坐标轴都采用对数刻度,对应的matplotlibh函数是matplotlib.pyplot..loglog()。半对数图的一个坐标轴采用线性刻度,另一个坐标轴使用对数刻度,它对应的matplotlib API是semilogx()函数和semilogy()函数,在双对数图上,幂律表现为直线;在半对数图上,直线则代表的是指数律。
  摩尔定律大意为集成电路上晶体管的数量每两年增加一倍。在https://en.wikipedia.org/wiki/Transistor_count#Microprocessors页面有一个数据表,记录了不同年份微处理器上晶体管的数量。我们为这些数据制作一个CSV文件,名为transcount.csv,其中只包含晶体管数量和年份值。

代码:

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)

运行结果:
python数据分析(数据可视化)
python数据分析(数据可视化)
实线表示的是趋势线,实心圆表示的是数据点。

3、散点图

散点图可以形象展示直角坐标系中两个变量之间的关系,每个数据点的位置实际上就是两个变量的值。泡式图是对散点图的一种扩展。在泡式图中,每个数据点都被一个气泡所包围,它由此得名;而第三个变量的值正好可以用来确定气泡的相对大小。
在https://en.wikipedia.org/wiki/Transistor_count#GPU页面上,有个记录GPU晶体数量的数据表,我们用这些晶体管数量年份数据新建表gpu_transcount.csv。借助matplotlib API提供的scatter()函数绘制散点图。
代码:
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()

运行结果

      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
python数据分析(数据可视化)
python数据分析(数据可视化)

4、图例和注解

要想做出让人眼前一亮的神图,图例和注解肯定是少不了的。一般情况下,数据图都带有下列辅助信息。
  • 用来描述图中各数据序列的图例,matplotlib提供的legend()函数可以为每个数据序列提供相应的标签。
  • 对图中要点的注解。可以借助matplotlib提供的annotate()函数。
  • 横轴和纵轴的标签,可以通过xlabel()和ylabel()绘制出来。
  • 一个说明性质的标题,通常由matplotlib的title函数来提供.
  • 网格,对于轻松定位数据点非常有帮助。grid()函数可以用来决定是否使用网格。
代码:
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()

运行结果:
python数据分析(数据可视化)

5、三维图

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

运行结果:

python数据分析(数据可视化)


6、pandas绘图

pandas的Series类和DataFrame类中的plot()方法都封装了相关的matplotlib函数。如果不带任何参数,使用plot方法绘制图像如下:

代码:

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()
运行结果:

python数据分析(数据可视化)

python数据分析(数据可视化)

python数据分析(数据可视化)

7、时滞图

时滞图实际上就是一个散点图,只不过把时间序列的图像及相同序列在时间轴上后延图像放一起展示而已。例如,我们可以利用这种图考察今年的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()

运行结果:
python数据分析(数据可视化)

8、自相关图

自相关图描述的是时间序列在不同时间延迟情况下的自相关性。所谓自相关,就是一个时间序列与相同数据在不同时间延迟情况下的相互关系。利用pandas子库pandas.tools.plotting 中的autocorrelation_plot()函数,就可以画出自相关图了。

代码:

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()
运行结果:

python数据分析(数据可视化)
从图中可以看出,较之于时间上越远(即时间延迟越大)的数值,当前的数值与时间上越接近(及时间延迟越小)的数值相关性越大;当时间延迟极大时,相关性为0;

9、Plot.ly

Plot.ly实际上是一个网站,它不仅提供了许多数据可视化的在线工具,同时还提供了可在用户机器上使用的对应的python库。可以通过Web接口或以本地导入并分析数据,可以将分析结果公布到Plot.ly网站上。

安装plotly库:pip install plotly

先在plotly注册一个账号,然后产生一个api_key。最后可以绘制箱形图。

代码:

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

运行结果:

python数据分析(数据可视化)