1. 程式人生 > >利用python進行資料分析-繪圖和視覺化1

利用python進行資料分析-繪圖和視覺化1

matplotlib AIP入門

1.Figure和Subplot

matplotlib的影象都位於Figure物件中。你可以用plt.figure建立一個新的Figure:

fig=plt.figure()

這時會彈出一個空視窗。plt.figure有一些選項,特別是figsize,它用於確保圖片儲存到磁碟時具有一定大小和縱橫比。matplotlib中的Figure還支援一種MATLAB式的編號架構(例如plt.figure(2))。通過plt.gcf()即可得到當前Figure的引用。

不能通過空Figure繪圖。必須用add_subplot建立一個或多個subplot才行

ax1=fig.add_subplot(2,2,1)

這段程式碼的意思是:影象應該是2*2的,且當前選中的是4個subplot中的第一個(編號從1開始)。如果再把後面兩個subplot也創建出來,最終得到的影象如圖所示

ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)

如果這時發出一條繪圖命令(plt.plot(randn(50).cumsum(),'k--')),matplotlib就會在最後一個用過的subplot(如果沒有則建立一個)上進行繪製

from numpy.random import randn

plt.plot(randn(50).cumsum(),'k--')

結果為:

‘k--’是一個線型選項,用於告訴matplotlib繪製黑色虛線圖。上面那些由fig.add_subplot所返回的物件是AxesSubplot物件,直接呼叫它們的例項方法就可以在其它空著的格子裡畫圖了

_=ax1.hist(randn(100),bins=20,color='k',alpha=0.3)
ax2.scatter(np.arange(30),np.arange(30)+3*randn(30))

結果為:

由於根據特定佈局建立Figure和subplot是一件非常常見的任務,於是便出現了一個更為方便的方法(plt.subplots),它可以建立一個新的Figure,並返回一個含有已建立的subplot物件的NumPy陣列

fig,axes=plt.subplots(2,3)
print axes

結果為:

[[<matplotlib.axes._subplots.AxesSubplot object at 0x0000000009062BA8>
  <matplotlib.axes._subplots.AxesSubplot object at 0x0000000009291080>
  <matplotlib.axes._subplots.AxesSubplot object at 0x00000000099A0F98>]
 [<matplotlib.axes._subplots.AxesSubplot object at 0x000000000A68FD30>
  <matplotlib.axes._subplots.AxesSubplot object at 0x0000000009A406A0>
  <matplotlib.axes._subplots.AxesSubplot object at 0x000000000928FCC0>]]

你可以輕鬆地對axes陣列進行索引,就好像一個二維陣列一樣,例如,axes[0,1]。你還可以通過sharex和sharey指定subplot應該具有相同的X軸或Y軸。

2.調整subplot周圍的間距

利用Figure的subplots_adjust方法可以輕而易舉地修改間距,它是個頂級函式

subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None)

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)

結果為:

3.顏色、標記和線型

例如,要根據x和y繪製綠色虛線,可以執行如下程式碼

ax.plot(x,y,'g--')

通過下面這種更為明確的方式也能得到同樣的效果

ax.plot(x,y,linesytle='--',clolor='g')

使用顏色也可以指定其RGB值的形式使用,如#CECECE

線形圖還可以加上一些標記,以強調實際的資料點。標記也可以放到格式化字串中,但標記型別和線型必須放在顏色後面

plt.plot(randn(30).cumsum(),'ko--')

結果為:

還可以將其寫成更為明確的形式

plt.plot(randn(30).cumsum(),color='k',linestyle='dashed',marker='o')

線上型圖中,非實際資料點預設按線性方式插值的。可以通過drawstyle選項修改

plt.plot(data,'k--',label='Default')

結果為:

plt.plot(data,'k-',drawstyle='steps-post',label='steps-post')

結果為:

plt.legend(loc='best')

結果為:

4.刻度、標籤和圖例

對於大多數圖表裝飾項,其主要實現方式有二:使用過程型的pyplot介面(MATLAB使用者非常熟悉)以及面向物件的原生matplotlib API

pyplot介面其主要使用方式有以下兩種:

a.呼叫時不帶引數,則返回當前的引數值。例如,plt.xlim()返回當前的X軸繪圖範圍。

b.呼叫時帶引數,則設定引數值。因此,plt.xlim([0,10])會將X軸的範圍設定為0到10

所有這些方法都是對當前或最近建立的AxesSubplot起作用的。它們各自對應subplot物件上的兩個方法,以xlim為例,就是ax.get_xlim和ax.set_xlim。

設定標題、軸標籤、刻度以及刻度標籤

fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum())
ticks=ax.set_xticks([0,250,500,750,1000])
labels=ax.set_xticklabels(['one','two','three','four','five'],
                          rotation=30,fontsize='small')
ax.set_title('My first matplotlib plot')
ax.set_xlabel('Stages')

結果為:

新增圖例

新增圖例的方式有兩種。最簡單的是在新增subplot的時候傳入label引數

fig1=plt.figure()
ax1=fig1.add_subplot(1,1,1)
ax1.plot(randn(1000).cumsum(),'k',label='one')
ax1.plot(randn(1000).cumsum(),'k--',label='two')
ax1.plot(randn(1000).cumsum(),'k.',label='three')
ax1.legend(loc='best')

結果為:

loc告訴matplotlib要將圖例放在哪。要從圖例中去除一個或多個元素,不傳入label或label='_nolegned_'即可

4.註解以及在Subplot上繪圖

註解可以通過text、arrow和annotate等函式進行新增

ax.text(x,y,'Hello world!',family='monospace',fontsize=10)

實際案例

import matplotlib.pyplot as plt
from numpy.random import randn
import numpy as np
from datetime import datetime
import pandas as pd

fig=plt.figure()
ax=fig.add_subplot(1,1,1)
data=pd.read_csv('data/spx.csv',index_col=0,parse_dates=True)
spx=data['SPX']
spx.plot(ax=ax,style='k-')

crisis_data=[
    (datetime(2007,10,11),'Peak of bull market'),
    (datetime(2008,3,12),'Bear Stearns Fails'),
    (datetime(2008,9,15),'Lehman Bankruptcy')
]

for date,label in crisis_data:
    ax.annotate(label,xy=(date,spx.asof(date)+50),
                xytext=(date,spx.asof(date)+200),
                arrowprops=dict(facecolor='black'),
                horizontalalignment='left',verticalalignment='top')
                
ax.set_xlim(['1/1/2007','1/1/2011'])
ax.set_ylim([600,1800])
ax.set_title('Import dates in 2008-2009 financial crisis')

結果為:

要在圖表中新增一個圖形,你需要建立一個塊物件shp,然後通過ax.add_patch(shp)將其新增到subplot中

fig1=plt.figure()
ax1=fig1.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)
ax1.add_patch(rect)
ax1.add_patch(circ)
ax1.add_patch(pgon)

結果為:

5.將圖表儲存到檔案

利用plt.savefig可以將當前圖表儲存到檔案。該方法相當於Figure物件的例項方法savefig。

在釋出圖片時最常用到兩個最重要的選項是dpi(控制“每英寸點數”解析度)和bbox_inches(可以剪除當前表周圍的空白部分)

plt.savefig('figpath.png',dpi=400,bbox_inches='tight')

savefig並非一定要寫入磁碟,也可以寫入任何檔案型物件,比如StirngIO

from io import StringIO

buffer=StringIO()

plt.savefig(buffer)

plot_data=buffer.getvalue()

6.matplotlib配置

操作matplotlib配置系統的方式主要有兩種。第一種是Python程式設計方式,即利用rc方法。如:plt.rc('figure',figsize=(10,10))

rc的第一個引數是希望自定義的物件

font_options={'family':'monospace',

                       'weight':'bold',

                       'size':'small'}

plt.rc('font',**font_options)