Python資料分析:手把手教你用Pandas生成視覺化圖表
大家都知道,Matplotlib 是眾多 Python 視覺化包的鼻祖,也是Python最常用的標準視覺化庫,其功能非常強大,同時也非常複雜,想要搞明白並非易事。但自從Python進入3.0時代以後,pandas的使用變得更加普及,它的身影經常見於市場分析、爬蟲、金融分析以及科學計算中。
作為資料分析工具的集大成者,pandas作者曾說,pandas中的視覺化功能比plt更加簡便和功能強大。實際上,如果是對圖表細節有極高要求,那麼建議大家使用matplotlib通過底層圖表模組進行編碼。當然,我們大部分人在工作中是不會有這樣變態的要求的,所以一句import pandas as pd就足夠應付全部的視覺化工作了。下面,我們總結一下PD庫的一些使用方法和入門技巧。
一、線型圖
對於pandas的內建資料型別,Series 和 DataFrame 都有一個用於生成各類 圖表 的 plot 方法。 預設情況下, 它們所生成的是線型圖。其實Series和DataFrame上的這個功能只是使用matplotlib
庫的plot()
方法的簡單包裝實現。參考以下示例程式碼 -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('2018/12/18',
periods=10), columns=list('ABCD'))
df. plot()
Python執行上面示例程式碼,得到以下結果 -
如果索引由日期組成,則呼叫gct().autofmt_xdate()
來格式化x
軸,如上圖所示。
我們可以使用x
和y
關鍵字繪製一列與另一列。
s = Series( np. random. randn( 10). cumsum(), index= np. arange( 0, 100, 10))
s. plot()
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()
二、柱狀圖
在生成線型圖的程式碼中加上 kind=' bar'( 垂直柱狀圖) 或 kind=' barh'( 水平柱狀圖) 即可生成柱狀圖。 這時,Series 和 DataFrame 的索引將會被用 作 X( bar) 或 (barh)刻度:
In [59]: fig, axes = plt. subplots( 2, 1)
In [60]: data = Series( np. random. rand( 16), index= list(' abcdefghijklmnop'))
In [61]: data. plot( kind=' bar', ax= axes[ 0], color=' k', alpha= 0. 7)
Out[ 61]: < matplotlib. axes. AxesSubplot at 0x4ee7750>
In [62]: data. plot( kind=' barh', ax= axes[ 1], color=' k', alpha= 0.
對於 DataFrame, 柱狀 圖 會 將 每一 行的 值 分為 一組, 如圖 8- 16 所示:
In [63]: df = DataFrame( np. random. rand( 6, 4), ...: index=[' one', 'two', 'three', 'four', 'five', 'six'], ...: columns= pd. Index([' A', 'B', 'C', 'D'], name=' Genus'))
In [64]: df
Out[ 64]:
Genus
A B C D
one 0. 301686 0. 156333 0. 371943 0. 270731
two 0. 750589 0. 525587 0. 689429 0. 358974
three 0. 381504 0. 667707 0. 473772 0. 632528
four 0. 942408 0. 180186 0. 708284 0. 641783
five 0. 840278 0. 909589 0. 010041 0. 653207
six 0. 062854 0. 589813 0. 811318 0. 060217
In [65]: df. plot( kind=' bar')
三、條形圖
現在通過建立一個條形圖來看看條形圖是什麼。條形圖可以通過以下方式來建立 -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d'])
df.plot.bar()
Python執行上面示例程式碼,得到以下結果 -
要生成一個堆積條形圖,通過指定:pass stacked=True -
import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d'])
df.plot.bar(stacked=True)
Python執行上面示例程式碼,得到以下結果 -
要獲得水平條形圖,使用barh()
方法 -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d'])
df.plot.barh(stacked=True)
P四、直方圖
可以使用plot.hist()
方法繪製直方圖。我們可以指定bins
的數量值。
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.plot.hist(bins=20)
Python執行上面示例程式碼,得到以下結果 -
要為每列繪製不同的直方圖,請使用以下程式碼 -
import pandas as pd
import numpy as np
df=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.hist(bins=20)
Python執行上面示例程式碼,得到以下結果 -
五、箱型圖
Boxplot可以繪製呼叫Series.box.plot()
和DataFrame.box.plot()
或DataFrame.boxplot()
來視覺化每列中值的分佈。
例如,這裡是一個箱形圖,表示對[0,1)
上的統一隨機變數的10
次觀察的五次試驗。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()
Python執行上面示例程式碼,得到以下結果 -
六、塊型圖
可以使用Series.plot.area()
或DataFrame.plot.area()
方法建立區域圖形。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()
Python執行上面示例程式碼,得到以下結果 -
七、散點圖
可以使用DataFrame.plot.scatter()
方法建立散點圖。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')
Python執行上面示例程式碼,得到以下結果 -
八、餅狀圖
餅狀圖可以使用DataFrame.plot.pie()
方法建立。
import pandas as pd
import numpy as np
df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)
Python執行上面示例程式碼,得到以下結果 -
參考文章:
[2]Python for Data Analysis,Wes McKinney,public in 2012