1. 程式人生 > >python:matplotlib及pandas繪圖(1)

python:matplotlib及pandas繪圖(1)

利用python進行資料分析

第八章:繪圖和視覺化

matplotlib APL入門

>>> import matplotlib.pyplot as plt
>>> import numpy as np

1,Figure和Subplot

matplotlib的影象都位於Figure物件中,可通過plt.figure建立一個新的Figure
>>> fig=plt.figure() #建立一個新的Figure
>>> plt.show() #可展示圖形結果
因為不能通過空的Figure繪圖,所以必須用add_subplot建立一個或多個subplot才能進行繪圖
>>> ax1=fig.add_subplot(2,2,1)

#表示圖形排布是2X2橫向兩張圖,縱向兩張圖,且當前選中的是4個subplot中的第一個(編號從1開始)。後面還會再建立兩個subplot
>>> ax2=fig.add_subplot(2,2,2) #所以add_subplot一定要有三個輸入引數
>>> ax3=fig.add_subplot(2,2,3)
如果這時發出一條繪圖命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib就會在最後一個用過的subplot(如果沒有則建立一個)上進行繪圖。
>>> from numpy.random import randn

>>> plt.plot(randn(50).cumsum(), 'k--')
[<matplotlib.lines.Line2D object at 0x0000000008E74630>]
>>> plt.show()
“k–”是一個線型選項,表示黑色虛線。“–”表示虛線,“-”表示實線
線條顏色選型:
| Alias | Color |
|‘b’ | blue |
|‘g’ | green |
|‘r’ | red |
|‘c’ | cyan |
|‘m’| magenta |
|‘y’ | yellow |
|‘k’ | black |
|‘w’| white |
之後再輸入如下內容能夠將上述三個圖表內均進行畫圖
>>> _=ax1.hist(randn(100), bins=20, color='k', alpha=0.3)

>>> ax2.scatter(np.arange(30), np.arange(30)+3*randn(30))
>>> plt.show()
會展示畫圖的三張圖片,‘k–’,ax1和ax2

可利用plt.subplots方法建立Figure和subplot任務,它可以建立一個新的Figure,並返回一個含有已經建立的subplot物件的NumPy陣列
>>> fig, axes=plt.subplots(2, 3) #建立一個兩行三列的空圖表
>>> fig
<matplotlib.figure.Figure object at 0x0000000008CA6E10>
>>> axes
array([[< matplotlib.axes._subplots.AxesSubplot object at 0x0000000008EED4A8>,
< matplotlib.axes._subplots.AxesSubplot object at 0x00000000091AFB38>,
< matplotlib.axes._subplots.AxesSubplot object at 0x000000000921B390>],
[< matplotlib.axes._subplots.AxesSubplot object at 0x000000000935BB00>,
< matplotlib.axes._subplots.AxesSubplot object at 0x0000000009429F28>,
< matplotlib.axes._subplots.AxesSubplot object at 0x000000000951EC88>]], dtype=object)

>>> plt.show() #展示一個兩行三列的空圖表
表8-1:pyplot.subplots的選項
| 引數 | 說明 |
| nrows | subplot的行數 |
| ncols | subplot的列數 |
| sharex | 所有subplot應該使用相同的X軸刻度(調節xlim將會影響所有subplot) |
| sharey | 所有subplot應該使用相同的Y軸刻度(調節ylim將會影響所有subplot) |
| subplot_kw | 用於建立各subplot的關鍵字字典 |
| **fig_kw | 建立figure時的其他關鍵字,如plt.subplots(2,2,figsize=(8,6)) |
>>> plt.subplots(2,2,figsize=(8,6)) #建立一個兩行兩列的空圖表,圖表大小為8,6

調整subplot周圍的間距
subplot_adjust可調整各個子圖表之間的間距
>>> subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) #subplots_adjust方法所展示的函式及其引數
wspace和hspace用於控制寬度和高度的百分比,可以用作subplot之間的間距。
例如:
>>> fig, axes=plt.subplots(2, 2, sharex=True, sharey=True)
>>> for i in range(2):
...····for j in range(2):
...········axes[i, j].hist(randn(500), bins=50, color='k', alpha=0.5)
>>> plt.subplots_adjust(wspace=0, hspace=0) #調節各個圖表之間的間距為0
>>> plt.show() #展示4個圖表各個子圖表之間沒有間距而且標籤沒有重疊

2,顏色、標記和線型

matplotlib的plot函式能夠接受一組X和Y座標,同時能夠接受一個表示顏色和線型的字串縮寫。例如,要根據x和y繪製綠色虛線,可執行如下程式碼:
>>> plt.plot([1.5, 3.5, -2, 1.6], 'g--')
>>> plt.show()
‘g–’這樣的簡寫是允許的,同時也可利用如下的方式
>>> plt.plot([1.5, 3.5, -2, 1.6], linestyle='--', color='g')
>>> plt.show()
linestyle引數寫明線條型別,color引數寫明線條顏色
顏色的選擇也可通過RGB的形式進行表示(例如:’#CECECE’)

線型圖還可以加上一些標記(marker),以強調實際的資料點,由於matplotlib建立的是連續的線型圖(點與點之間插值),因此有時可能不太容易看出真實資料的位置。標記也可以放到格式字串中,但表示型別和線型必須放在顏色後面
>>> from numpy.random import randn
>>> plt.plot(randn(30).cumsum(), 'ko--')
>>> plt.show()
‘k’:表示線型,‘o’:表示圓點,‘–’:表示虛線
也可以寫另外一種形式
>>> plt.plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='o')
>>> plt.show()

線上型圖中,非實際資料點預設是按照線性方式插值的。可通過drawstyle選項進行修改
通過如下方法可在同一圖表中畫出兩種線條
>>> data=randn(30).cumsum()
>>> plt.plot(data, 'k--', label='Default')
預設畫圖是黑色虛線,每個點之間用線段連線,整個圖形是折線
>>> plt.plot(data, 'g--', drawstyle='steps-post', label='steps-post')
而steps-post表示的是四邊形的線條,從第一個點平行畫出該點與第二個點距離相同的線條,然後向上或向下垂直畫線到第二個點上。該圖形用綠色虛線表示
>>> plt.legend(loc='best') #目前不懂
>>> plt.show()

3,刻度、標籤和圖例

1,設定標題、軸標籤、刻度以及刻度標籤
>>> from numpy.random import randn
>>> fig=plt.figure()
>>> ax=fig.add_subplot(1, 1, 1) #建立一個繪圖集
>>> ax.plot(randn(1000).cumsum())
要修改X軸的刻度,最簡單的方法是使用set_xticksset_xticklables
set_xticks表示matplotlib要將刻度放在資料範圍中的哪些位置,預設情況下,這些位置就是刻度標籤。但可通過set_xticklables將任何其他的值作為標籤
>>> ax.set_xticks([0, 250, 500, 750, 1000]) #設定X軸刻度,共細分為5個刻度(0,250,500,750,1000)
>>> ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=30, fontsize='small') #設定這5個刻度的X軸標籤為(one,two,three,four,five)rotation,表示設定標籤與X軸存在一定的傾斜角度,如果不加該引數,則預設X軸標籤字型與X軸平行,fontsize,表示設定字型大小,並存在以下幾個選項(Size is invalid. Valid font size are large, medium, smaller, None, small, x-large, xx-small, larger, x-small, xx-large
最後,再用set_xlabel為X軸設定一個名稱,並用set_title設定一個標題
>>> ax.set_title('My first matplotlib plot') #設定圖表標題
>>> ax.set_xlabel('Stages') #設定X軸名稱
同樣道理Y軸可以用yticks,yticklabels以及set_ylabel表示

2,新增圖例
圖例(legend)是另一種用於表示圖表元素的重要工具。新增圖例的方式有二,最簡單的是在新增subplot的時候傳入label引數:
>>> fig=plt.figure(); ax=fig.add_subplot(1, 1, 1)
>>> ax.plot(randn(1000).cumsum(), 'k', label='one')
>>> ax.plot(randn(1000).cumsum(), 'k--', label='two')
>>> ax.plot(randn(1000).cumsum(), 'g', label='three')
之後看呼叫ax.legend()plt.legend()來自動建立圖例
>>> ax.legend(loc='best')
legend即圖例的標註位置有一下幾種選擇:
right
center left
upper right
lower right
best
center
lower left
center right
upper left
upper center
lower center

best表示最佳選擇位置,其他選項均選擇固定位置
要從圖例中除去一個或多個元素,不傳入label或傳入label='_nolegend_'即可,如:
>>> ax.plot(randn(1000).cumsum(), 'g', label='_nolegend_')

4,註釋以及在Subplot上繪圖

除了標準的圖表物件之外,你可能還希望繪製一些自定義的註解(比如文字、箭頭或其他圖形等)。
註解可以通過text、arrow和annotate等函式進行新增。text可以將文字繪製在圖表的指定座標(x,y),還可以加上一些自定義格式:
>>> ax.text(x, y, 'Hello world!', family='monospace', fontsize=10) #x和y都要定義數值,比如200和0
>>> ax.text(200, 0, 'Hello world!', family='monospace', fontsize=10)
>>> plt.show() #之後會在(0,200)這個座標的位置出現一個’Hello world!’的標註,但是沒有箭頭指示
註解中可以既含有文字也含有箭頭
如果想要加入箭頭和文字就要使用annotate函式,
參考matplotlib Plotting Cookbook.pdf書,86頁
>>> X = np.linspace(-4, 4, 1024)
>>> Y = .25 * (X + 4.) * (X + 1.) * (X - 2.)
>>> plt.annotate('Brackmard minimum', ha = 'center', va = 'bottom', xytext = (-1.5, 3.), xy = (0.75, -2.7), arrowprops = { 'facecolor' : 'black', 'shrink' : 0.05 })
>>> plt.plot(X, Y)
>>> plt.show()

5,繪製圖形

相對於線條的繪製來說圖形的繪製較為麻煩,matplotlib有一些常見圖形的物件,這些物件被稱為快(patch)。其中有些可在matplotlib.pyplot中找到(如Rectangle何Circle),但完整集合位於matplotlib.patches。
要在圖表中新增一個圖形,你需要建立一個塊物件shp,然後通過ax.add_patch(shp)將其新增到subplot中:
>>> fig=plt.figure()
>>> ax=fig.add_subplot(1, 1, 1)
>>> rect=plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
>>> circ=plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
>>> pgon=plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]], color='g', alpha=0.5)
>>> ax.add_patch(rect)
>>> ax.add_patch(circ)
>>> ax.add_patch(pgon)
>>> plt.show()

6,將圖表儲存到檔案

利用plt.savefig可以將當前圖表儲存到檔案。該方法相當於Figure物件的例項方法savefig。例如,要將圖表儲存在SVG檔案,需要輸入
>>> plt.savefig('figpath.svg')
檔案型別是通過副檔名推斷出來的,所以*.pdf會儲存為一個PDF格式檔案,當儲存圖片時有兩個重要的選項dpi(控制“每英寸點數”解析度)和bbox_inches(可以剪除當前圖表周圍的空白部分)。要得到一張帶有最小白邊且解析度為400DP的PNG圖片,需要輸入
>>> plt.savefig('figpath.png', dpi=400, bbox_inches='tight')
表8-2:Figure.savefig的選項
| 引數 | 說明 |
| fname | 含有檔案路徑的字串或Python的檔案型物件。影象格式由副檔名推斷得出,例如:.pdf推斷出PDF,.png推斷出PNG |
| dpi | 影象解析度(每英寸點數),預設為100 |
| facecolor、edgecolor | 影象的背景色,預設為‘w’(白色) |
| format | 顯示設定檔案格式(“png”,“pdf”,“svg”,“ps”,“eps”… …)
| bbox_inches | 圖表需要儲存的部分,如果設定為“tight”,則將嘗試剪除圖表周圍的空白部分 |

7,matplotlib配製

matplotlib自帶一些配色方案,以及為生成出版質量的圖片而設定的預設配製資訊。這些預設行為可通過全域性引數進行自定義。他們可以管理影象大小、subplot邊距、配色方案、字型大小、網格型別等。
操作matplotli配置系統的方式主要有兩種。第一種是Python程式設計方式,即利用rc方法。比如說,要將全域性的影象預設大小設定為10x10,可執行:
>>> plt.rc('figure', figsize=(10, 10))
rc的第一個引數是希望自定義的物件,如’figure’, ‘axes’, ‘xtick’, ‘ytick’, ‘grid’, ‘legend’等。其後可以加入一系列的關鍵字引數,可將這些選項寫成一個字典:
>>> font_options={'family': 'monospace', 'weight': 'bold', 'size': 'small'}
>>> plt.rc('font', **font_options)