轉自:http://blog.csdn.net/genome_denovo/article/details/78322628
pandas繪圖總結
pandas中的繪圖函數(更加詳細的繪圖資料可參考pandas.pdf文檔中的Visualization這一章)
>>> import pandas as pd
>>> import numpy as np
>>> from pandas import Series, DataFrame
>>> import matplotlib.pyplot as plt
>>> import matplotlib
>>> matplotlib.style.use('ggplot')
1, 繪圖入門
在繪圖之前先准備數據,數據形式必須是np.array()形式的數組數據,利用上面導入的matplotlib模塊進行繪圖;
例子:
>>> np.arange(20)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> plt.plot(np.arange(20))
[<matplotlib.lines.Line2D object at 0x2ac914e15fd0>]
>>> plt.show()
最后生成一個由點連接的y=x的線性圖
>>> plt.plot(np.array([2.5, 4.1, 2.7, 8.8, 1.0]))
#生成由5個點組成的兩個點之間用線連接的折線
如果想利用pandas繪圖,可得到Series或DataFrame對象,並利用series.plot()或dataframe.plot()進行繪圖;
例子:
>>> Series(np.array([2.5, 4.1, 2.7, 8.8, 1.0]))
0 2.5
1 4.1
2 2.7
3 8.8
4 1.0
dtype: float64
>>> series=Series(np.array([2.5, 4.1, 2.7, 8.8, 1.0]))
>>> series.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x2ac914bab250>
>>> plt.show()
利用Series方法得到的折線圖和plt.plot(np.arange(20))繪制的折線圖圖像大致相似,但圖形的X軸坐標與Series的索引值相對應,X軸坐標從0到4,坐標原點為(0, 0);
而對於DataFrame繪圖,則其每個column都為一個繪圖圖線,會將每個column作為一個圖線都繪制到一張圖片當中,並用不同的線條顏色及不同的圖例標簽進行表示;
例如:
>>> dataframe=DataFrame({'A':[9.3, 4.3, 4.1, 5.0, 7.0], 'B':[2.5, 4.1, 2.7, 8.8, 1.0]})
>>> dataframe
A B
0 9.3 2.5
1 4.3 4.1
2 4.1 2.7
3 5.0 8.8
4 7.0 1.0
>>> dataframe.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x2ada670665d0>
>>> plt.show()
··· ···所有繪圖
會得出與上述相同的結果
• ‘bar’ or ‘barh’ for bar plots #條狀圖
• ‘hist’ for histogram #頻率柱狀圖(計算某些值出現的頻率)
• ‘box’ for boxplot #箱線圖()
• ‘kde’ or ‘density’ for density plots #密度圖(需要scipy這個包)
• ‘area’ for area plots #區域圖(不同域的面積占比)
• ‘scatter’ for scatter plots #散點圖 >>> plt.scatter(df['part A'], df['part B'])
• ‘hexbin’ for hexagonal bin plots # >>> plt.hexbin(df['part A'], df['part B'], df['part C'])
• ‘pie’ for pie plots #餅圖,比較適合與Series對象,看不同的占比
上面羅列了所有可能繪制的圖形
df.plot.<TAB>
#可以利用".<TAB>"的方法繪制不同的圖像
df.plot.area df.plot.barh df.plot.density df.plot.hist df.plot.line df.plot.scatter df.plot.bar df.plot.box df.plot.hexbin df.plot.kde df.plot.pie
2,線型圖(Series.plot方法的參數,專用DataFrame的plot參數)
對於Series.plot方法的參數,DataFrame是可以應用的
style參數,表示傳給matplotlib的風格的字符串(如’ko–’),其中‘k’表示的是線條顏色,對於線條顏色的種類還有以下幾個細分:
Alias Colors
b Blue
g Green
r Red
c Cyan
m Magenta
y Yellow
k Black
w White
其中‘o’表示線條中點的存在形式,o表示實心圓點,x表示x型點;
其中‘-’表示線型,‘-’表示實線,‘–’表示虛線。
也可將這三者表示形式分開,寫法如:
>>> series.plot(linestyle='dashed', color='k', marker='o')
>>> series.index.name='site'
Series對象的index.name值,在生成圖表后會生成X軸的標簽
對於DataFrame對象,其生成的表格的column值在進行繪圖后會生成圖例標簽
>>> dataframe.plot(linestyle='dashed', color='k', marker='o', xticks=[0, 1, 2, 3, 4], yticks=list(np.arange(0, 10.0, 0.5)) ,xlim=[-0.25, 4.25])
設定X及Y軸刻度值,以及X軸的刻度界限
>>> dataframe.plot(title='dataframe photo')
#加入圖像的標題
在繪圖命令中加入subplots=True參數,則會將DataFrame當中的每一列結果繪制到一個子圖片中,如果加入sharex=True參數,則各個子圖片共用一個X軸標簽;同理sharey=True表示共用一個Y軸;
>>> dataframe.plot(subplots=True, sharex=True)
array([<matplotlib.axes._subplots.AxesSubplot object at 0x06A627F0>, <matplotlib.axes._subplots.AxesSubplot object at 0x06E4E0D0>], dtype=object)
>>> plt.show()
3,柱狀圖
在生成線形圖的代碼中加入kind=’bar’(垂直柱狀圖)或kind=’barh’(水平柱狀圖)即可生成柱狀圖。這時,Series和DataFrame的索引將會被用作X(bar)或Y(barh)刻度
>>> dataframe.plot(kind='bar')
········>>> dataframe.plot(kind='barh')
生成柱狀圖,DataFrame對象的每一列會生成一個柱狀圖結果,多個列會將這個結果繪制在一個表格中,不同的列所繪制的柱狀圖顏色不同;
>>> dataframe.index=['once', 'twice', 'thrice', 'forth', 'fifth']
>>> dataframe
··A·B
once·9.3·2.5
twice·4.3·4.1
thrice·4.1·2.7
forth·5.0·8.8
fifth·7.0·1.0
繪制的柱狀圖的X軸或Y軸標簽為DataFrame對象的index值
plt.figure(); dataframe.plot(kind=’bar’); plt.axhline(0, color=’k’),”.axhline”的主要作用是在縱軸x=0的位置加入一條黑色的直線,來分隔y>0的軸和y<0的軸。
堆積柱狀圖:設置stacked=True即可為DataFrame生成堆積柱狀圖,這樣每行的值就會被堆積在一起:
>>> df=DataFrame({'part A': [2.8, 5.5, 4.5, 7.0, 1.0], 'part B': [4.2, 1.2, 4.5, 2.5, 8.0], 'part C': [3.0, 3.3, 1.0, 0.5, 1.0]}, index=['May', 'June', 'July', 'August', 'September'])
>>> df.name='bonus'
>>> df
···part A·part B·part C
May·2.8·4.2·3.0
June·5.5·1.2·3.3
July·4.5·4.5·1.0
August·7.0·2.5·0.5
September·1.0·8.0·1.0
>>> df.plot(kind='barh', stacked=True)
最終繪制出堆積圖,同時:
>>> df.plot.barh(stacked=True)
4,直方圖密度圖
直方圖(histogram)是一種可以對值頻率進行離散化顯示的柱狀圖。數據點被拆分到離散的、間隔均勻的面元中,繪制的是各面元中數據點的數量。
>>> length=DataFrame({'length': [10, 20,15,10,1,12,12,12,13,13,13,14,14,14,51,51,51,51,51,4,4,4,4]})
>>> length.plot.hist()
>>> plt.show()
最終得到的數字頻率分布直方圖,X軸是DataFrame當中的數值分布,Y軸是對應數值出現的次數;
密度圖,利用數值出現頻率繪制的直方圖進行曲線擬合,會得到密度圖;繪制的圖形是根據直方圖得到的條狀分布的頂點連接后得到的平滑曲線,X軸是DataFrame當中的數值分布,Y軸是密度(Density)。
>>> length.plot.density(color='k')
#length.plot.kde(color=’k’)得到同樣的圖形結果
>>> plt.show()
直方圖畫法進階
>>> df4 = DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), 'c': np.random.randn(1000) - 1}, index=range(1,1001), columns=['a', 'b', 'c'])
設定1000個隨機數為column b,而隨機數的數值+1和-1作為column a和column c;
>>> plt.figure()
#表示設定繪制圖標對象
>>> df4.plot.hist(stacked=True, bins=20, alpha=0.5)
#bins=20表示數值分辨率,具體來說是將隨機數設定一個范圍,例如5.6,5.7,6.5,如果數值分辨率越低,則會將三個數分到5-7之間,如果數值分辨率越高,則會將5.6,5.7分到5-6之間,而6.5分到6-7之間;值越小表示分辨率越低,值越大表示分辨率越高;
>>> df4['a'].plot.hist(orientation='horizontal', cumulative=True)
#該圖是將DataFrame對象當中的a進行數值累加,並繪制橫向直方圖,橫軸表示頻率(Frequency),縱軸表示數值,cumulative=True的效果是將Frequency的數值從大到小進行排列。
>>> df4.diff().hist(color='k', alpha=0.5, bins=50)
#該效果是將DataFrame當中column分開,即將a,b和c分開繪制成三張圖。df4.diff().hist()可達到這個效果,即將所有column分開。
5,箱線圖
箱線圖所表示的各個數值的含義:線條右下到上分別表示
最小值、第一四分位數、中位數、第三四分位數和最大值
第一四分位數(Q1),又稱“較小四分位數”或“下四分位數”,等於該樣本中所有數值由小到大排列后第25%的數字;
第二四分位數(Q2),又稱“中位數”,等於該樣本中所有數值由小到大排列后第50%的數字;
第三四分位數(Q3),又稱“較大四分位數”或“上四分位數”,等於該樣本中所有數值由小到大排列后第75%的數字;
第三四分位數與第一四分位數的差距又稱四分位間距(InterQuartile Range,IQR)。
計算四分位數首先要確定Q1、Q2、Q3的位置(n表示數字的總個數):
Q1的位置=(n+1)/4
Q2的位置=(n+1)/2
Q3的位置=3(n+1)/4
具體解釋及實例可參考如下網址:http://blog.csdn.net/zhanghongju/article/details/18446131
箱線圖可以用如下方式繪制
Series.plot.box()
, DataFrame.plot.box()
, DataFrame.boxplot()
例如:
>>> df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
>>> df.plot.box()
繪制ABCDE這5個箱線圖
np.random.rand產生的隨機數都為0-1之間的正數,而np.random.randn產生的隨機數中既有正值又有負值
修改箱線圖線條顏色需要有一下4個方面,即boxes(盒身),whiskers(須),
medians(中位數),caps(最大值,最小值),可以將顏色與上面的4個keys建立字典關系,並在繪圖時引入color。
>>> color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray'))
>>> df.plot.box(color=color, sym='r+')
#boxplot has sym keyword to specify fliers style
>>> df.plot.box(color=color)
#繪圖效果和上述一樣
盒身為深綠色,須為深黃色,中位數為深藍色,最大最小值為灰色
>>> df.plot.box(vert=False, positions=[1, 4, 5, 6, 8])
#可繪制水平箱線圖,positions表示的意思是ABCDE這5個箱線圖擺放位置,A在1位置,B在4位置,AB之間間隔2,3這兩個位置。
同樣,也可以根據DataFrame屬性當中的’by’參數進行分組畫圖
You can create a stratified boxplot using the by keyword argument to create groupings
>>> df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
>>> df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
#在df存在Col1和Col2兩列的基礎上增加X這一列,然后根據index編號進行賦值;對於DataFrame對象以Series方法增加column。
>>> plt.figure(); bp = df.boxplot(by='X')
注意:如果用>>> plt.figure(); df.plot.box(by='X')
或者>>> df.plot.box(by='X')
方法繪制圖片,最終不會得到分組的畫圖效果
使用兩組標簽可以實現多分組繪圖
>>> df = pd.DataFrame(np.random.rand(10,3), columns=['Col1', 'Col2', 'Col3'])
>>> df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
>>> df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
>>> df
Col1 Col2 Col3 X Y
0 0.081142 0.059051 0.862650 A A
1 0.142670 0.554862 0.931373 A B
2 0.720987 0.968380 0.560167 A A
3 0.104103 0.031059 0.832768 A B
4 0.153403 0.050152 0.747177 A A
5 0.146358 0.016951 0.013774 B B
6 0.387617 0.485473 0.583479 B A
7 0.447248 0.498259 0.424981 B B
8 0.539854 0.386803 0.410169 B A
9 0.129224 0.910483 0.348707 B B
>>> plt.figure(); bp = df.boxplot(column=['Col1','Col2'], by=['X','Y'])
最終繪制的圖片樣式為,出現兩個分組,分組后的X軸的大標簽是[X, Y],每個分組的X軸的小標簽為(A, A) (A, B) (B, A) (B ,B),這樣繪圖也是根據df的X列和Y列的分組結果而得到的。
6,區域面積圖
繪圖方式:Series.plot.area()
和DataFrame.plot.area()
NA值的處理方法:
When input data contains NaN, it will be automatically filled by 0. If you want to drop or fill by different values, use dataframe.dropna() or dataframe.fillna() before calling plot
>>> df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
>>> df.plot.area()
#生成堆積圖
>>> df.plot.area(stacked=False)
#非堆積效果圖
7,散點圖
繪圖方式:DataFrame.plot.scatter()
散點圖需要設定X軸及Y軸的數值;Scatter plot requires numeric columns for x and y axis.
>>> df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
#abcd四列中,各列設定50個隨機數
>>> df.plot.scatter(x='a', y='b')
#之后以a列為X軸數值,b列為Y軸數值繪制散點圖
如果想將不同的散點圖信息繪制到一張圖片當中,需要利用不同的顏色和標簽進行區分
To plot multiple column groups in a single axes, repeat plot method specifying target ax. It is recommended to specify color and label keywords to distinguish each groups.
>>> ax = df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1')
#先設定第一個散點圖,顏色為深藍色標簽為Group 1,以ab兩列作為x及y軸的值
>>> df.plot.scatter(x='c', y='d', color='DarkGreen', label='Group 2', ax=ax)
#第二個散點圖以cd兩列作為x及y軸的值,顏色為深綠色標簽為Group 2,ax=ax的作用是將ax這個圖繪制到Group 2圖片當中,形成兩層圖形嵌套關系
如果想得到4層圖形嵌套關系需要運用如下方法:
>>> ab=df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1')
#a列與b列的繪圖關系
>>> abcd=df.plot.scatter(x='c', y='d', color='DarkGreen', label='Group 2', ax=ab)
#將ab的繪圖關系嵌套到c列和d列的繪圖關系中:ax=ab
>>> abcdac=df.plot.scatter(x='a', y='c', color='DarkRed', label='Group 3', ax=abcd)
#將ab的繪圖關系及cd的繪圖關系的匯總關系當中加入到a列和c列的繪圖關系中:ax=abcd
>>> df.plot.scatter(x='b', y='d', color='DarkGray', label='Group 4', ax=abcdac)
#將上述3種關系的繪圖嵌套到b列和d列的繪圖關系中:ax=abcdac
>>> help(df.plot.scatter)
scatter(self, x, y, s=None, c=None, **kwds)
c參數表示的是點圖的灰度水平,用0-1數值表示,1表示透明,0表示不透明,數值越大透明度越高,將數值寫入單引號中;
The keyword c may be given as the name of a column to provide colors for each point
>>> df.plot.scatter(x='a', y='b', c='c', s=50)
#c參數設定為df的第c列數值,表示的是繪制的點的灰度水平,同時灰度水平會出現一個灰度梯度標簽表示不同的灰度級別。
s參數表示的是點的大小,用pd.Series表示
You can pass other keywords supported by matplotlib scatter. Below example shows a bubble chart using a dataframe column values as bubble size
>>> df.plot.scatter(x='a', y='b', s=df['c']*200)
#用df的c列數值的200倍表示點的大小
8,餅圖
繪圖方式:DataFrame.plot.pie()
和Series.plot.pie()
餅圖展現的是百分比關系,所以數值當中如果出現NA值在繪圖時默認為0,負值會報錯
If your data includes any NaN, they will be automatically filled with 0. A ValueError will be raised if there are any negative values in your data.
>>> series = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
#首先創建一個Series對象
>>> series
a 2.311426
b 1.595443
c 2.268239
d 2.227010
Name: series, dtype: float64
>>> series.plot.pie(figsize=(6, 6))
#繪制餅圖,圖片規格為figsize=(6, 6)
對於Series對象,生成4個隨機數,在生成餅圖之后看各個index的占比
而對於DataFrame對象,每一個column都可獨立繪制一張餅圖,但需要利用subplots=True參數將,每個餅圖繪制到同一張圖中。
>>> df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y'])
>>> df
···x y
a 2.116810 0.643499
b 0.678533 0.164728
c 2.142849 2.590517
d 2.077125 2.926192
>>> df.plot.pie(subplots=True, figsize=(8, 4))
最終繪制兩張餅圖,分別是column x和y及各自的abcd占比
You can use the labels and colors keywords to specify the labels and colors of each wedge
>>> series = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
>>> series
a 2.548463
b 1.716728
c 2.009944
d 0.735294
Name: series, dtype: float64
>>> series.plot.pie(labels=['AA', 'BB', 'CC', 'DD'], colors=['r', 'g', 'b', 'c'], autopct='%.2f', fontsize=20, figsize=(6, 6))
繪制的餅圖,label分別是AA對應a,BB對應b,CC對應c,DD對應d,四種顏色rgbc分別對應,autopct顯示各個index所占百分比,並保留兩位小數,字體大小fontsize,圖片大小figsize。
If you pass values whose sum total is less than 1.0, matplotlib draws a semicircle
如果所有數字總和加起來小於1.0,則會畫一個半圓。
>>> series = pd.Series([0.1] * 4, index=['a', 'b', 'c', 'd'], name='series2')
>>> series
a 0.1
b 0.1
c 0.1
d 0.1
Name: series2, dtype: float64
>>> series.plot.pie(figsize=(6, 6))
各個index數值都為0.1,所以只能繪制半圓
9,各種繪圖方式對於缺失值的處理
Missing values are dropped, left out, or filled depending on the plot type
| Plot Type | NaN Handling |
| Line | Leave gaps at NaNs |
| Line (stacked) | Fill 0’s |
| Bar | Fill 0’s |
| Scatter | Drop NaNs |
| Histogram | Drop NaNs (column-wise) |
| Box | Drop NaNs (column-wise) |
| Area | Fill 0’s |
| KDE | Drop NaNs (column-wise) |
| Hexbin | Drop NaNs |
| Pie | Fill 0’s |
If any of these defaults are not what you want, or if you want to be explicit about how missing values are handled, consider using fillna() or dropna() before plotting.
散點圖,柱狀圖,箱線圖,密度圖,都是將NA值去除
堆積圖,條狀圖,區域圖,餅圖都是將NA值填充為0