瞭解了 Matplotlib 的基本知識之後,我們就可以開始上手試試畫圖了。
先從最常見的圖形開始:折線圖、條形圖、柱狀圖、散點圖、圓形圖。
我不得不說本 Part 實際上都是沒有什麼邏輯的語法規定,會比較無聊。不過這一 Part 又最有用,因為看完之後用 Matplotlib 繪圖就沒什麼問題了(如果你對圖形細節沒什麼要求的話~)
用於繪圖的資料
因為最近搞了個預測招商銀行股價的比賽,部分繪圖就直接用這個資料了。
import tushare as ts
pro = ts.pro_api('***********************')# *** 為註冊 tushare 後分配的 token
cmb = pro.daily(ts_code='600036.SH', start_date='20190301', end_date='20190510')
複製程式碼
動手之前,還得再多說一點
在利用 Matplotlib 繪製資料圖形(一)中我寫過:如果你想用 Matplotlib 繪圖,需要建立至少一個 fig 且其中包含一個 axes。
fig,ax_1 = plt.subplots()
複製程式碼
但是我們又常見下面的寫法:
沒有手動建立 fig 和 axes 怎麼也出圖了呢? 答案是:如果呼叫了 plt 的繪圖方法,但是 plt 卻沒有追蹤到 fig 和/或 axes ,plt 會預設建立新的 fig 和/或 axes(Matplotlib 的兩套 API)。
plt 追蹤 fig 和 axes 的過程對使用者是隱形的,我們只需要知道每次呼叫 plt 繪圖方法,該繪圖效果都會呈現在當前 axes 中就可以了(後面會講如何手動變更 plt 當前 fig 和 axes)
OK, Matplotlib
折線圖、條形圖、柱狀圖、散點圖、圓形圖分別對應著 Matplotlib 中的五個繪圖函式:plot()、bar()、hist()、scatter()、pie()。
plt.plot([x],y) #注意這裡的 x 其實是可選的,但實際使用中僅傳入 y 比較少見
plt.scatter(x,y)
plt.bar(x,height) #保持和官方文件一致,使用 height 代替 y
plt.hist(x)
plt.pie(x)
複製程式碼
其中 .plot()
x 可選的意思是:如果僅傳入一個位置引數的話,函式預設使用者傳入的是 y,x 則預設為序列 [0,1,2,3,4,....]與 y 的資料一一對應。所以之前我繪製的圖形僅傳入了 'open' 一個變數是沒問題的。
不過上面的折線圖沒有什麼意義,折線圖實際中用的比較多的是時間序列,因為折線圖反應了的是前後有內在聯絡的變化。
所以很多時候折線圖 x 軸是時間,y 軸為資料:
plt.plot('trade_date','open',data = cmb)
複製程式碼
不過預設的時間軸大部分情況下是 —— 沒法用的(?)。
Matplotlib 提供了一個專門的模組 mdates 來處理與時間有關的問題。
其中的各種 Locator 專門用來生成時間刻度。 所以時間序列刻度自動不好用的話就手動吧23333。
程式碼比較簡單,直接扔出來,看註釋:
import matplotlib.dates as mdates
months = mdates.MonthLocator() # 月 ticker
days = mdates.DayLocator() # 日 ticker
dateFmt = mdates.DateFormatter('%m-%d')
ax = plt.gca()# 獲取當前 axes
datemin = np.datetime64('2019-03-10')# 時間軸最小值
datemax = np.datetime64('2019-05-10') + np.timedelta64(1) # 時間軸最大值
ax.set_xlim(datemin, datemax)# 設定時間軸的區間
ax.xaxis.set_major_locator(months) # 將月 ticker 設定為主刻度
ax.xaxis.set_major_formatter(dateFmt)
ax.xaxis.set_minor_locator(days) # 將日 ticker 設定為小刻度
plt.plot('trade_date','open',data = cmb)
plt.gcf().autofmt_xdate() #獲取當前fig 並自動調整tick label
plt.show()
複製程式碼
折線圖還有一個常用的場景是在同一幅圖繪製多個不同變數的變化曲線。這怎麼做呢?
plt.plot('trade_date','close',data = cmb)
複製程式碼
不切換當前 fig 和 axes ,直接繼續繪製就在同一張圖裡了。
但這種方法也不好,資料多了一行一行加麻煩。比如我想直接在一張圖裡繪製 'open',‘high','low','close' 四個變數,得加四行。
更好的辦法是把這四個變數提取出來:
ohlc = cmb.loc[:,['open','high','low','close']].values
plt.plot(cmb['trade_date'].values,ohlc)
複製程式碼
Matplotlib 會自動將 y 中的每一列資料繪製稱同一條曲線。
然後大家要求又來了,四個圖顏色倒是區分了,我怎麼知道哪個顏色代表誰呢?所以要把圖例新增上:
plt.gca().legend(['open','high','low','close'])#按照plot y 的資料順序傳入 legend 字串就行。
複製程式碼
至此,一個有實際意義且資訊準確的折線圖就完工了。
自己用的話到這裡就差不多了,如果想製作為報告中可使用的圖,還有很多美化的工作需要進行。