繪圖與可視化--pandas中的繪圖函數


matplotlib是一種比較低級的工具,要組裝一張圖表,你得用它得各種基礎組件才行:數據展示(即圖表類型:線型圖、柱狀圖、盒型圖、散布圖、等值線圖等)、圖例、標題、刻度標簽以及其它注釋型信息。

在pandas中,有行標簽、列標簽及分組信息,要繪制一張圖,需要很多matplotlib代碼。pandas有很多能夠利用DataFrame對象數據組織特點來創建標准圖表的高級繪圖方法。

1.1 線型圖

Series和DataFrame都有一個用於生成各類圖表的plot方法,默認情況下,生成的是線型圖。

1 >>> s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
2 >>> s.plot()
3 <matplotlib.axes._subplots.AxesSubplot object at 0x0000024F35B8A898>
4 >>> plt.show()

該Series對象的索引會傳給matplotlib,並用以繪制X軸,可通過use_index=False禁用該功能。X軸的刻度和界限可以通過xticks和xlim選項進行調節,Y軸就用yticks和ylim。plot參數完整列表如下所示:

參數

說明

label

用於圖例的標簽

ax

要在其上進行繪制的matplotlib subplot對象,如果沒有設置,則使用當前matplotlib subplot

style

將要傳給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

顯示軸網格線(默認打開)

pandas的大部分繪圖方法都有一個可選的ax參數,它可以是一個matplotlib的subplot對象。

DataFrame的plot方法會在一個subplot中為各列繪制一條線,並自動創建圖例。

1 >>> df = pd.DataFrame(np.random.randn(10, 4).cumsum(0), columns=['A', 'B', 'C', 'D'], index=np.arange(0, 100, 10))
2 >>> df.plot()
3 <matplotlib.axes._subplots.AxesSubplot object at 0x0000024F35B8AFD0>
4 >>> plt.show()

  

DataFrame還有一些用於對列進行靈活處理的選項。下表是專用於DataFrame的plot參數。

參數

說明

subplots

將各個DataFrame列繪制到單獨的subplot中

sharex

如果subplots=True,則共用同一個X軸,包括刻度和界限

sharey

如果subplots=True,則共用同一個Y軸

figsize

表示圖像大小的元組

title

表示圖像標題的字符串

legend

添加一個subplot實例(默認為True)

sort_columns

以字母順序繪制各列,默認使用當前列順序

1.2  柱狀圖

在生成線性圖的代碼中加上kind=’bar’(垂直柱狀圖)或kind=’barh’(水平柱狀圖)即可生成柱狀圖。這時,Series和DataFrame的索引將會被當作X(bar)或Y(barh)刻度。

1 >>> fig, axes = plt.subplots(2, 1) 
2 >>> data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop')) 
3 >>> data.plot(kind='bar', ax=axes[0], color='k', alpha=0.7) 
4 <matplotlib.axes._subplots.AxesSubplot object at 0x0000024F37F3FE48>
5 >>> data.plot(kind='barh', ax=axes[1], color='k', alpha=0.7) 
6 <matplotlib.axes._subplots.AxesSubplot object at 0x0000024F37F794A8>
7 >>> plt.show()

對於DataFrame,柱狀圖會將每一行的值分為一組。

 1 >>> df = pd.DataFrame(np.random.rand(6, 4), index=['one', 'two', 'three', 'four', 'five', 'six'], columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
 2 >>> df
 3 Genus         A         B         C         D
 4 one    0.466419  0.388390  0.045920  0.188829
 5 two    0.795635  0.566636  0.916473  0.944628
 6 three  0.386224  0.993829  0.273204  0.573622
 7 four   0.134991  0.591803  0.778073  0.150384
 8 five   0.854561  0.058758  0.922147  0.764897
 9 six    0.923109  0.324739  0.717597  0.682992
10 >>> df.plot(kind='bar')
11 <matplotlib.axes._subplots.AxesSubplot object at 0x0000024F37FB1F28>
12 >>> plt.show()

 設置stacked=True即可生成堆積柱狀圖,每行的值會被堆積在一起。

1 >>> df.plot(kind='bar', stacked=True, alpha=0.5) 
2 <matplotlib.axes._subplots.AxesSubplot object at 0x0000024F3A2F2048>
3 >>> plt.show()

 

1.1.3  直方圖和密度圖

直方圖(histogram)是一種可以對值頻率進行離散化顯示的柱狀圖。數據點被拆分到離散的、間隔均勻的面元中,繪制的是各面元中數據點的數量。

 1 >>> s
 2 0   -0.674014
 3 1    0.342018
 4 2   -0.189962
 5 3    0.528294
 6 4    1.597546
 7 5    1.530765
 8 6    2.699712
 9 7    1.422388
10 8   -1.295660
11 9   -1.539913
12 dtype: float64
13 >>> s.hist(bins=5)
14 <matplotlib.axes._subplots.AxesSubplot object at 0x000002295B737978>
15 >>> plt.show()

與此相關的一種圖表類型是密度圖,它是通過計算“可能產生觀測數據的連續概率分布的估計”而產生的。一般的過程是將該部分近似為一組核(即諸如正態(高斯)分布之類的較為簡單的分布)。因此,密度圖也被稱為KDE(kernel density estimate核密度估計)圖。調用plot時加上kind=’kde’即可生成一張密度圖(標准混合正態分布KDE)。

 1 >>> import scipy                                                                       
 2 >>> s.plot(kind='kde')
 3 <matplotlib.axes._subplots.AxesSubplot object at 0x0000022959D0DA90>
 4 >>> plt.show()
 5 >>> s
 6 0   -0.674014
 7 1    0.342018
 8 2   -0.189962
 9 3    0.528294
10 4    1.597546
11 5    1.530765
12 6    2.699712
13 7    1.422388
14 8   -1.295660
15 9   -1.539913
16 dtype: float64

 這兩種圖形常常畫在一起,直方圖以規格化形式給出(以便給出畫元化密度),然后再在其上繪制核密度估計。下面給一個由兩個不同的標准正態分布組成的雙峰分布。

1 >>> comp1 = np.random.normal(0, 1, size=200)
2 >>> comp2 = np.random.normal(10, 2, size=200) 
3 >>> values = pd.Series(np.concatenate([comp1, comp2])) 
4 >>> values.hist(bins=100, alpha=0.3, color='k', density=True) 
5 <matplotlib.axes._subplots.AxesSubplot object at 0x0000022959CFC6D8>
6 >>> values.plot(kind='kde', style='k--') 
7 <matplotlib.axes._subplots.AxesSubplot object at 0x0000022959CFC6D8>
8 >>> plt.show()

1.4  散布圖

散布圖(scatter plot)是觀察兩個一維數據序列之間關系的有效手段,matplotlib的scatter方法是繪制散布圖的主要方法。

 1 >>> df = pd.DataFrame(np.random.rand(4, 2), index=[1, 2, 3, 4], columns=['one', 'two']) 
 2 >>> df
 3         one       two
 4 1  0.658181  0.390797
 5 2  0.443482  0.673915
 6 3  0.188783  0.442284
 7 4  0.048783  0.578914
 8 >>> plt.scatter(df['one'], df['two'])
 9 <matplotlib.collections.PathCollection object at 0x000002295D2D77B8>
10 >>> plt.title('test') 
11 Text(0.5, 1.0, 'test')
12 >>> plt.show()

 

在探索式數據分析中,同時觀察一組變量的散布圖很有意義,這也被稱為散布矩陣(scatter plot matrix)。pandas提供了從DataFrame創建散布圖矩陣的scatter_matrix函數。還支持在對角線上放置各變量的直方圖和密度圖。

 1 >>> df    
 2         one       two
 3 1  0.658181  0.390797
 4 2  0.443482  0.673915
 5 3  0.188783  0.442284
 6 4  0.048783  0.578914
 7 >>> pd.plotting.scatter_matrix(df, diagonal='kde', color='r', alpha=0.3)  
 8 array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000002295D23D860>,
 9         <matplotlib.axes._subplots.AxesSubplot object at 0x000002295D1A4940>],
10        [<matplotlib.axes._subplots.AxesSubplot object at 0x000002295D09EEF0>,
11         <matplotlib.axes._subplots.AxesSubplot object at 0x000002295D0DC4E0>]],
12       dtype=object)
13 >>> plt.show()


免責聲明!

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



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