python3繪圖和可視化(二)


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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM