数据可视化是指将数据放在可视环境中、进一步理解数据的技术,可以通过它更加详细地了解隐藏在数据表面之下的模式、趋势和相关性。
Python提供了很多数据可视化的库:
pandas
matlpotlib和pandas结合
利用pandas进行数据读取、数据清洗和数据选取等操作,再使用matlpotlib显示数据。
matplotlib是Python最著名的绘图库,它提供了一整套和Matlab相似的命令API,十分适合
交互式地进行制图;也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源代码。如果需要绘制某种类型的图,只需要在这个页面中进行简单的浏览、复制、粘贴,就能实现画图。
matplotlib画图的子库:
使用matplotlib快速绘图导入库和创建绘图对象如下:
import matplotlib.pyplot as plt plt.figure(figsize=(8,4))
创建绘图对象时,同时使它成为当前的绘图对象。
通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。
因此本例中所创建的图表窗口的宽度为8 * 80 = 640像素。
也可以不创建绘图对象直接调用plot方法绘图,matplotlib会自动创建一个绘图对象。
如果需要同时绘制多幅图表的话,可以给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。
pyplot画图简单使用如下:
import numpy as np import matplotlib.pyplot as plt # 首先载入matplotlib的绘图模块pyplot,并且重命名为plt x = np.linspace(0, 10, 1000) y = np.sin(x) z = np.cos(x**2) plt.figure(figsize=(8,4)) #2 创建绘图对象 plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2) plt.plot(x,z,"b--",label="$cos(x^2)$") plt.xlabel("Time(s)") plt.ylabel("Volt") plt.title("PyPlot First Example") plt.ylim(-1.2,1.2) plt.legend() plt.show()
显示:
其中:
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2) plt.plot(x,z,"b--",label="$cos(x^2)$")
第一行将x、y数组传递给plot之后,用关键字参数指定各种属性:
plt.xlabel("Time(s)") plt.ylabel("Volt") plt.title("PyPlot First Example") plt.ylim(-1.2,1.2) plt.legend()
通过一系列函数设置当前Axes对象的各个属性:
最后调用plt.show()显示出绘图窗口。
一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图Axes)。可以使用subplot函数快速绘制有多个轴的图表。
subplot函数的调用形式如下:
subplot(numRows, numCols, plotNum)
subplot将整个绘图区域等分为numRows行和numCols列个子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。
如果numRows、numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。
subplot在plotNum指定的区域中创建一个轴对象,如果新创建的轴和之前创建的轴重叠,之前的轴将被删除。
如下:
for idx, color in enumerate("rgbyck"): plt.subplot(320+idx+1, facecolor=color) plt.show()
显示:
可以看到:
创建3行2列共6个轴,通过facecolor参数给每个轴设置不同的背景颜色。
如果希望某个轴占据整个行或者列的话,可以如下:
plt.subplot(221) # 第一行的左图 plt.subplot(222) # 第一行的右图 plt.subplot(212) # 第二整行 plt.show()
显示:
再举一个创建子图的例子:
plt.figure(1) # 创建图表1 plt.figure(2) # 创建图表2 ax1 = plt.subplot(211) # 在图表2中创建子图1 ax2 = plt.subplot(212) # 在图表2中创建子图2 x = np.linspace(0, 3, 100) for i in range(5): plt.figure(1) # 选择图表1 plt.plot(x, np.exp(i*x/3)) plt.sca(ax1) # 选择图表2的子图1 Set the current Axes instance to ax. plt.plot(x, np.sin(i*x)) plt.sca(ax2) # 选择图表2的子图2 plt.plot(x, np.cos(i*x)) plt.show()
显示:
首先通过figure()创建了两个图表,它们的序号分别为1和2;
然后在图表2中创建了上下并排的两个子图,并用变量ax1和ax2保存。
在循环中:
先调用figure(1)让图表1成为当前图表,并在其中绘图。
然后调用sca(ax1)和sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。
当它们成为当前子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)依次在图表1和图表2的两个子图之间切换,逐步在其中添加新的曲线即可。
其中,twinx()可以为图增加纵坐标轴,使用如下:
x = np.arange(1, 21, 0.1) y1 = x * x y2 = np.log(x) plt.plot(x, y1) # 添加一条y轴的坐标轴 plt.twinx() plt.plot(x, y2) plt.show()
显示:
进一步使用如下:
import numpy as np import matplotlib.pyplot as plt x = np.arange(1, 20, 1) y1 = x * x y2 = np.log(x) fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(x, y1, label = "$y1 = x * x$", color = "r") ax1.legend(loc = 0) # 设置对应坐标轴的名称 ax1.set_ylabel("y1") ax1.set_xlabel("Compare y1 and y2") # 设置x轴刻度的数量 ax = plt.gca() ax.locator_params("x", nbins = 20) # 添加坐标轴,并在新添加的坐标轴中画y2 = log(x)图像 ax2 = plt.twinx() ax2.set_ylabel("y2") ax2.plot(x, y2, label = "$y2 = log(x)$") ax2.legend(loc = 0) plt.show()
显示:
画图在工作中在所难免,尤其在进行数据探索时显得尤其重要,matplotlib常见的一些作图种类如下:
先导入库和基础配置如下:
from __future__ import division from numpy.random import randn import numpy as np import os import matplotlib.pyplot as plt np.random.seed(12345) plt.rc('figure', figsize=(10, 6)) from pandas import Series, DataFrame import pandas as pd np.set_printoptions(precision=4) get_ipython().magic(u'matplotlib inline') get_ipython().magic(u'pwd')
打印:
'XXX\\3_Visualization_Of_Data_Analysis\\basicuse'
基础画图如下:
# matplotlib创建图表 plt.plot([1,2,3,2,3,2,2,1]) plt.show() plt.plot([4,3,2,1],[1,2,3,4]) plt.show()
显示:
画三角函数曲线如下:
# 画简单的图形 from pylab import * x=np.linspace(-np.pi,np.pi,256,endpoint=True) c,s=np.cos(x),np.sin(x) plot(x,c, color="blue", linewidth=2.5, linestyle="-", label="cosine") plot(x,s,color="red", linewidth=2.5, linestyle="-", label="sine") show()
显示:
画散点图如下:
# 散点图 from pylab import * n = 1024 X = np.random.normal(0,1,n) Y = np.random.normal(0,1,n) scatter(X,Y) show()
显示:
画条形图如下:
#条形图 from pylab import * n = 12 X = np.arange(n) Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n) Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n) bar(X, +Y1, facecolor='#9999ff', edgecolor='white') bar(X, -Y2, facecolor='#ff9999', edgecolor='white') for x,y in zip(X,Y1): text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom') ylim(-1.25,+1.25) show()
显示:
饼图如下:
#饼图 from pylab import * n = 20 Z = np.random.uniform(0,1,n) pie(Z) show()
显示:
画立体图如下:
#画三维图 import numpy as np from mpl_toolkits.mplot3d import Axes3D from pylab import * fig=figure() ax=Axes3D(fig) x=np.arange(-4,4,0.1) y=np.arange(-4,4,0.1) x,y=np.meshgrid(x,y) R=np.sqrt(x**2+y**2) z=np.sin(R) ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap='hot') show()
显示:
画其他简单图形如下:
#更多简单的图形 x = [1,2,3,4] y = [5,4,3,2] plt.figure() plt.subplot(2,3,1) plt.plot(x, y) plt.subplot(232) plt.bar(x, y) plt.subplot(233) plt.barh(x, y) plt.subplot(234) plt.bar(x, y) y1 = [7,8,5,3] plt.bar(x, y1, bottom=y, color = 'r') plt.subplot(235) plt.boxplot(x) plt.subplot(236) plt.scatter(x,y) plt.show()
显示:
pandas中画图的主要类型包括:
先导入所需要的库:
from __future__ import division from numpy.random import randn import numpy as np import os import matplotlib.pyplot as plt np.random.seed(12345) from pandas import Series, DataFrame import pandas as pd %matplotlib inline
在pandas中,有行标签、列标签和分组信息等,如果使用matplotlib画图,可能需要一大堆的代码,现在调用Pandas的plot()方法即可简单实现。
画简单线图如下:
#线图 s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10)) s.plot() plt.show()
显示:
pandas.Series.plot()的常见参数及说明如下:
参数说明参数说明label用于图例的标签ax要在其上进行绘制的matplotlib subplot对象,如果没有设置,则使用当前matplotlib subplotstyle将要传给matplotlib的风格字符串,例如'ko-'alpha图表的填充不透明(0-1)kind可以是'line'、'bar'、'barh'、'kde'logy在Y轴上使用对数标尺use_index将对象的索引用作刻度标签rot旋转刻度标签(0-360)xticks用作X轴刻度的值yticks用作Y轴刻度的值xlimX轴的界限ylimY轴的界限grid显示轴网格线
Pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象,从而能够在网络布局中更为灵活地处理subplot的位置。DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例。
画多列线图如下:
df = DataFrame(np.random.randn(10, 4).cumsum(0), columns=['A', 'B', 'C', 'D'], index=np.arange(0, 100, 10)) df.plot() plt.show()
显示:
相对于Series,DataFrame还有一些用于对列进行灵活处理的选项,例如要将所有列都绘制到一个subplot中还是创建各自的subplot等,具体如下:
画简单累和图如下:
#线图 CUM plt.close('all') s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10)) s.plot() plt.show()
显示:
画多列的类和图如下:
df = DataFrame(np.random.randn(10, 4).cumsum(0), columns=['A', 'B', 'C', 'D'], index=np.arange(0, 100, 10)) df.plot() plt.show()
显示:
当提升了数据规模之后,累和图如下:
s = pd.Series([2, np.nan, 5, -1, 0]) print(s) print(s.cumsum()) #画累和图 ts=pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000)) ts=ts.cumsum() ts.plot() plt.show() df=pd.DataFrame(np.random.randn(1000,4),index=ts.index,columns=list('ABCD')) # cumulative意为累计、累积,这个函数可以返回一个累计值,经常会遇到月累计、年累计这种指标,会用这个函数 df=df.cumsum() df.plot() plt.show()
打印:
0 2.0 1 NaN 2 5.0 3 -1.0 4 0.0 dtype: float64 0 2.0 1 NaN 2 7.0 3 6.0 4 6.0 dtype: float64
显示:
画Series柱状图如下:
#柱形图 fig, axes = plt.subplots(2, 1) data = Series(np.random.rand(16), index=list('abcdefghijklmnop')) data.plot(kind='bar', ax=axes[0], color='r', alpha=0.7) data.plot(kind='barh', ax=axes[1], color='g', alpha=0.7) plt.show()
显示:
DataFrame画柱状图:
df = DataFrame(np.random.rand(6, 4), index=['one', 'two', 'three', 'four', 'five', 'six'], columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus')) df.plot(kind='bar') #图例 plt.figure() df.plot(kind='barh', stacked=True, alpha=0.5) plt.show()
显示:
可以看到:
对于DataFrame,柱形图会将每一行的值分为一组;
DataFrame的各列名称都被用作了图例的标题;
设置stacked=True即可为DataFrame生成堆积柱形图,这样每行的值就会被堆积在一起。
餐馆小费数据如下:
此教程太长了,需要完整教程或者视频教程点击视频教程