1. 程式人生 > >python繪圖與視覺化--matplotlib

python繪圖與視覺化--matplotlib

主要用來記錄《利用python進行資料分析》一書第8章 繪圖與視覺化 

matplotlib繪圖

1. 載入模組:

%matplotlib inline
import numpy as np 
import matplotlib.pyplot as plt

在jupyter notebook中,若不使用魔法函式“%matplotlib inline”,需要適用plt.show()使繪圖顯示出來。

2. 繪製子圖

# plt.subplots(nrows,ncols,sharex=False,sharey=False)
# 圖表可分為幾行幾列的圖形,是否共享X軸/Y軸(便於同比例尺下對比)

fig, axes = plt.subplots(2,2,sharex=True, sharey=True)
for i in range(2):
    for j in range(2):
        axes[i,j].hist(np.random.randn(500),bins=50,color="k",alpha=0.5)

# subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
# 子圖的在大圖中的位置,前四個為子圖到大圖邊界的距離,wspace/hspace表示子圖間列間距和行間距
plt.subplots_adjust(wspace=0,hspace=0)

3. 顏色、標記、線型

根據x, y繪製綠色虛線'g--'

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

ax.plot(x, y, color='g', linestyle='--')

# 'ko--'繪製黑色帶實心圓mark的虛線圖
plt.plot(np.random.randn(30).cumsum(),'ko--')
# 等效的:
plt.plot(np.random.randn(30).cumsum(),color='k',linestyle='dashed',marker='o')

4. 刻度、標籤、圖例

set_xticks 設定x軸刻度標籤位置

set_xticklabels 設定x軸刻度標籤

set_title 設定標題

set_xlabel 設定x軸名稱

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())

# 要修改X軸的刻度,使用set_xticks設定刻度標籤位置和set_xticklabels設定刻度標籤
ticks = ax.set_xticks([0,250,500,750,1000])
labels = ax.set_xticklabels(['one','two','three','four','five'],rotation=30, fontsize='small')

# set_title設定標題,set_xlabel設定X軸名稱
ax.set_title('My first matplotlib plot')
ax.set_xlabel('stages')

新增圖例legend:

繪圖時新增label, 再在plt.legend() 建立圖例

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

# 繪圖時,新增label
ax.plot(np.random.randn(1000).cumsum(),'k',label='one')
ax.plot(np.random.randn(1000).cumsum(),'k--',label='two')
ax.plot(np.random.randn(1000).cumsum(),'k.',label='three')

# 通過ax.legend() 或 plt.legend() 自動建立圖例
ax.legend(loc='best')

5. 儲存圖表

儲存圖表 plt.savefig('foo.png')  檔案型別可以由副檔名定義,可選項:dpi  解析度(每英寸點數),bbox_inches 可以減除當前圖表的空白部分(tight表示留有最小白邊)

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

Pandas繪圖

在matplotlib中繪製一張圖需要組裝各種基礎元件(圖表、圖例、標題、刻度標籤以及其他註解),在pandas中只需要一兩行程式碼就能完成。

1. 線型圖

在pd.Series()和pd.DataFrame()中設定index(索引),columns(列名)等

data.plot中設定label(圖例的標籤),kind(可以是'line','bar','barh','kde','box'等圖表形式)等等P246中的關鍵字引數會被傳給相應的matplotlib繪圖函式。

# 調整圖片大小
matplotlib.rcParams['figure.figsize']=(9,6)

import pandas as pd

# Series.plot
s = pd.Series(np.random.randn(10).cumsum(),index=np.arange(1,100,10))
s.plot()

# DataFrame.plot
df = pd.DataFrame(np.random.randn(10,4).cumsum(0),
                  columns=['A','B','C','D'],
                  index=np.arange(0,100,10))
df.plot()

2. 柱狀圖

kind = 'bar'(垂直柱狀圖), kind = 'barh'(水平柱狀圖)

fig, axes = plt.subplots(2,1)
data=pd.Series(np.random.rand(16),index=list('abcdefghijklmnop'))
data.plot(kind='bar',ax=axes[0],color='k',alpha=0.7)
data.plot(kind='barh',ax=axes[1],color='k',alpha=0.7)

df = pd.DataFrame(np.random.rand(6,4),index=['one','two','three','four','five','six'],
                  columns=pd.Index(['A','B','C','D'],name='Genus'))
df.plot(kind='bar')

DataFrame中列名的名字“Genus”可作為圖例的名稱顯示出來

若在df.plot(kind='bar', stacked=True) 新增stacked=True,可繪製堆積柱狀圖

堆疊圖:各行規格化和為1後,再比較堆疊項

tips = pd.read_csv('tips.csv')
# 作聚會時間(day)和聚會規模(size)的交叉表,pd.crosstab(index, columns),表的內容為計數
party_counts = pd.crosstab(tips['day'],tips['size'])
# 由於規模為1和6的次數都較少,故切片去掉
party_counts = party_counts.loc[:,2:5]

# 規格化,使各行的和為1
party_pcts = party_counts.div(party_counts.sum(1).astype(float),axis=0)

party_pcts.plot(kind='bar',stacked=True)

在同一比例下對比不同時間聚會規模的佔比,可以明顯看得出在週末大規模聚會增多。

3. 直方圖histogram和密度圖

# 沿用上表-tips.csv

# 由df的某兩列運算得到新一列,小費百分比=小費/賬單
tips['tip_pct']=tips['tip']/tips['total_bill']

# 繪製直方圖
tips['tip_pct'].hist(bins=50)

# 繪製密度圖 plot(kind='kde')
tips['tip_pct'].plot(kind='kde')

直方圖和密度圖常常被畫在一起:

a. 用pandas API

tips['tip_pct'].hist(bins=50)
tips['tip_pct'].plot(kind='kde')

b. 可以用seaborn中的sns.distplot()

import seaborn as sns
sns.distplot(tips['tip_pct'])

4. 散佈圖 scatter plot(觀察兩個一維資料之間的關係)

 使用matplotlib和pandas API 作散佈圖

# 使用matplotlib.pyplot 可直接繪製兩列散點圖
plt.scatter(trans_data['m1'],trans_data['unemp'])
plt.title('Changes in log %s vs log %s' % ('m1','unemp'))

# 使用pandas API 可根據DataFrame建立散佈圖矩陣,還支援在對角線上放置各變數的直方圖或密度圖
pd.scatter_matrix(trans_data, diagonal='kde',color='k',alpha=0.3)