pandas中的繪圖函數
不難看出,matplotlib實際上是一種比較低級的工具。要組裝一張圖表,我們得用它的各種基礎組件才行:數據展示(即圖表類型:線型圖、柱狀圖、盒形圖、散布圖、等值線圖等)、圖例、標題、刻度標簽以及其他注解型信息。這是因為要根據數據制作一張完整圖表通常都需要用到多個對象。在pandas中,我們有行標簽、列標簽以及分組信息(可能有)。這也就是說,要制作一張完整的圖表,原本需要一大堆的matplotlib代碼,現在只需一兩條簡潔的語句就可以了。pandas有許多能夠利用DataFrame對象數據組織特點來創建標准圖表的高級繪圖方法(這些函數的數量還在不斷增加)。
線型圖
Series和DataFrame都有一個用於生成各類圖表的plot方法。默認情況下,它們所生成的是線型圖(如下圖所示):
通過ipython --pylab進入ipython,便於后面使用matplotlib的plot繪圖
C:\Users\Administrator>ipython --pylab
In [1]: from pandas import Series,DataFrame
In [2]: import numpy as np
In [3]: s=Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
In [4]: s.plot()
Out[4]: <matplotlib.axes._subplots.AxesSubplot at 0x100e6ac8>

該Series對象的索引會被傳給matplotlib,並用以繪制X軸。可以通過use_index=False禁用該功能。X軸的刻度和界限可以通過xticks和xlim選項進行調節,Y軸就用yticks和ylim。plot參數的完整列表請參見表一。這里只學習其中幾個。
pandas的大部分繪圖方法都有一個可選的ax參數,它可以是一個matplotlib的subplot對象。這使我們能夠在網格布局中更為靈活地處理subplot的位置。
DataFrame的plot方法會在一個subplot中為各列繪制一條線,並自動創建圖例,如下圖所示:
In [21]: from pandas import Series,DataFrame
In [22]: df=DataFrame(np.random.randn(10,4).cumsum(0),columns=['A','B','C','D']
...: ,index=np.arange(0,100,10))
In [23]: df.plot()
Out[23]: <matplotlib.axes._subplots.AxesSubplot at 0xef017b8>

表一:Series.plot方法的參數
參數 說明
label 用於圖例的標簽
ax 要在其上進行繪制的matplotlib subplot對象。如果沒有設置,則使用當前matplotlib subplot
sytle 將要傳給matplotlib的風格字符串(如‘ko--’)
alpha 圖表的填充不透明度(0到1之間)
kind 可以是'line'、'bar'、'barh'、'kde'
logy 在Y軸上使用對數標尺
use_index 將對象的索引用作刻度標簽
rot 旋轉刻度標簽(0到360)
xticks 用作X軸刻度的值
yticks 用作Y軸刻度的值
xlim X軸的界限(例如[0,10])
ylim Y軸的界限
grid 顯示軸網格線(默認打開)
DataFrame還有一些用於列進行靈活處理的選項,例如,是要將所有列都繪制到一個subplot中還是創建各自的subplot。詳細信息參見表二
表二:專用於DataFrame的plot的參數
參數 說明
subplot 將各個DataFrame列繪制到單獨的subplot中
sharex 如果subplots=True,則共用同一個X軸,包括刻度和界限
sharey 如果subplots=True,則共用同一個Y軸
figsize 表示圖像大小的元組
title 表示圖像標題的字符串
legend 添加一個subplot圖例(默認為True)
sort_columns 以字母表順序繪制各列,默認使用當前列順序
柱狀圖
在生成線形圖的代碼中加上kind='bar'(垂直柱狀圖)或kind='barh'(水平柱狀圖)即可生成柱狀圖。這時,Series和DataFrame的索引將會被用作X(bar)或Y(barh)刻度(如下圖所示):
In [19]: fig,axes=plt.subplots(2,1)
In [20]: data.plot(kind='bar',ax=axes[0],color='k',alpha=0.7)
Out[20]: <matplotlib.axes._subplots.AxesSubplot at 0x10fe6ba8>
In [21]: data.plot(kind='barh',ax=axes[1],color='k',alpha=0.7)
Out[21]: <matplotlib.axes._subplots.AxesSubplot at 0x110109e8>

對於DataFrame,柱狀圖會將每一行的值分為一組,如下圖所示:

注意,DataFrame各列的名稱"Grid"被用作了圖例的標題。設置stacked=True即可為DataFrame生成堆積柱狀圖,這樣每行的值就會被堆積在一起(如下圖所示):

直方圖和密度圖
直方圖(histogram)是一種可以對值頻率進行離散化顯示的柱狀圖。數據點被拆分到離散的、間隔均勻的面元中,繪制的是各面元中數據點的數量。與此相關的一種圖表類型是密度圖,它是通過計算“可能會產生觀測數據的連續概率分布的估計”而產生的。一般的過程是將該分布近似為一組核(即諸如正態(高斯)分布之類的較為簡單的分布)。因此,密度圖也被稱作KDE(Kernel Density Estimate,核密度估計)圖。調用plot時加上kind='kde'即可生成一張密度圖(標准混合正態分布KDE)
這兩種圖表常常會被畫在一起。直方圖以規格化形式給出(以便給出面元化密度),然后再在其上繪制核密度估計。接下來來看一個由兩個不同的標准正態分布組成的雙峰分布:
In [1]: from pandas import Series,DataFrame
In [2]: import pandas as pd
In [3]: import matplotlib.pyplot as plt
In [4]: import numpy as np
In [5]: import scipy
In [6]: comp1=np.random.normal(0,1,size=200) #生成一個高斯分布的概率密度函數
In [7]: comp2=np.random.normal(10,2,size=200) #生成一個高斯分布的概率密度函數
In [8]: values=Series(np.concatenate([comp1,comp2])) #將兩個圖拼接
In [9]: values.hist(bins=100,alpha=0.3,color='k',density=True) #生成直方圖
Out[9]: <matplotlib.axes._subplots.AxesSubplot at 0x106362e8>
In [10]: values.plot(kind='kde',style='k--') #這一步需要用到第三方庫scipy,所以要提前安裝scipy,生成密度圖
Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0xff21ef0>

注:numpy中
numpy.random.normal(loc=0.0, scale=1.0, size=None)
參數的意義為:
loc:float
概率分布的均值,對應着整個分布的中心center
scale:float
概率分布的標准差,對應於分布的寬度,scale越大越矮胖,scale越小,越瘦高
size:int or tuple of ints
輸出的shape,默認為None,只輸出一個值
我們更經常會用到np.random.randn(size)所謂標准正態分布(μ=0, σ=1),對應於np.random.normal(loc=0, scale=1, size)
散布圖
散布圖(scatter plot)是觀察兩個一維數據序列之間的關系的有效手段。matplotlib的scatter方法是繪制散布圖的主要方法。
下面看一個例子:
還是通過C:\Users\Administrator>ipython --pylab進入ipython
In [1]: import numpy as np
In [2]: import matplotlib.pyplot as plt
In [3]: N=50
In [5]: x=np.random.rand(N)
In [6]: y=np.random.rand(N)
In [7]: colors=np.random.rand(N)
In [8]: area=(30*np.random.rand(N))**2
In [9]: plt.scatter(x,y,s=area,c=colors,alpha=0.5)
Out[9]: <matplotlib.collections.PathCollection at 0xd7b1f98>

