利用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)