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)