1. 程式人生 > >資料視覺化之Matplotlib的使用

資料視覺化之Matplotlib的使用

1、什麼是資料視覺化

資料視覺化在量化分析當中是一個非常關鍵的輔助工具,往往我們需要通過視覺化技術,對我們的資料進行更清晰的展示,這樣也能幫助我們理解交易、理解資料。通過資料的視覺化也可以更快速的發現量化投資中的一些問題,更有利於分析並解決它們。接下來我們主要使用的視覺化工具包叫做——Matplotlib,它是基於Numpy和tkinter二次開發的,它是一個強大的Python繪圖和資料視覺化的工具包。

2、Matplotlib的用法

2.1、Matplotlib繪圖基礎

安裝方式:

pip install matplotlib

引用方法:

import matplotlib.pyplot as plt

matplotlib是python中的2D繪相簿,也是目前使用最廣泛的python繪相簿。雖然它很龐大,但是可以通過簡單的概念框架和重要的知識來理解掌握。它的影象大概可以分為以下4層結構。

1)canvas(畫板):位於最底層,匯入matplotlib庫時就自動存在。

2)figure(畫布):建立在canvas之上,從這一層就可以開始設定引數

3)axes(子圖):將figure分成不同的塊,實現分面繪圖

4)圖表資訊(構圖元素):添件或修改axes上的圖形資訊,優化圖表的顯示效果

2.2、繪圖基本流程

根據以上matplotlib的四層影象結構,pyplot模組繪製圖形基本都遵循一個流程。

匯入模組

先匯入相應工具包。根據官方認證方式匯入:

import numpy as np
import matplotlib.pyplot as plt

建立畫布和子圖

首先建立一張空白的畫布,設定畫布大小,根據需要同時展示幾個圖形,可以將畫布劃分為多個部分。然後使用物件方法來完成其餘的工作。

pic = plt.figure(figsize=(10,10),dpi=80)  # 建立一個10 x 10的畫布,畫素值為80
ax1 = pic.add_subplot(2,1,1)  # 劃分為2 x 1的圖形陣,選擇第一張圖片

新增畫布內容

繪圖的主體部分。新增標題、座標軸名稱等操作與繪製圖形時並列的,沒有先後順序,可以先繪製圖形,也可以先新增各類標籤,但是新增圖例一定要在繪製圖形之後。

方法 描述
plt.title() 設定影象標題
plt.xlabel() 設定x軸名稱
plt.ylabel() 設定y軸名稱
plt.xlim() 設定x軸範圍
plt.ylim() 設定y軸範圍
plt.xticks() 設定x軸刻度
plt.yticks() 設定y軸刻度
plt.legend() 設定曲線圖例

圖形儲存與展示

plt.savefig('圖片名稱+字尾名')  # 儲存圖片,可以自由指定圖片格式
plt.show()  # 展示圖形

整體流程

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize = (10,10),dpi = 80)  # 建立畫布。大小10x10,畫素80
x = np.linspace(0,1,1000)  # 通過numpy生成隨機數
fig.add_subplot(2,1,1)  # 分為2x1圖形陣,選擇第一張圖片繪圖
plt.title('y=x^2 or y=x')  # 新增標題
plt.xlabel('x')  # 新增x軸名稱
plt.ylabel('y')  # 新增y軸名稱
plt.xlim((0,1))  # 設定x軸範圍(0,1)
plt.ylim((0,1))  # 設定y軸範圍(0,1)
plt.xticks([0,0.3,0.6,1])  # 設定x軸刻度
plt.yticks([0,0.5,1])  # 設定y軸刻度
plt.plot(x,x**2)
plt.plot(x,x)
plt.legend(['y=x^2','y=x'])  # 新增圖例
plt.savefig('整體繪圖流程.png')  # 儲存圖片
plt.show()  # 展示圖片

2.3、繪圖風格

在matplotlib中,pyplot的一個子模組style當中定義了很多預設風格,方便進行風格轉換。每個預設風格都儲存在一個.mplstyle為字尾的style檔案中。

通過print(plt.style.available)可以檢視所有預設風格的名稱,通過use函式就可以直接設定預設風格。

檢視所有風格名稱

print(plt.style.available)

"""
['seaborn-dark', 'seaborn-darkgrid', 'seaborn-ticks', 'fivethirtyeight', 'seaborn-whitegrid', 'classic', '_classic_test', 'fast', 'seaborn-talk', 'seaborn-dark-palette', 'seaborn-bright', 'seaborn-pastel', 'grayscale', 'seaborn-notebook', 'ggplot', 'seaborn-colorblind', 'seaborn-muted', 'seaborn', 'Solarize_Light2', 'seaborn-paper', 'bmh', 'tableau-colorblind10', 'seaborn-white', 'dark_background', 'seaborn-poster', 'seaborn-deep']
"""

修改風格

x = np.linspace(0,1,1000)
plt.title('title')
plt.style.use('classic')  # 使用classic風格
plt.plot(x,x ** 2)
plt.plot(x,x)
plt.legend(['y=x^2','y=x'])

2.4、動態rc引數

pyplot模組使用rc配置檔案來自定義圖形的各種預設屬性,稱為rc配置或rc引數。通過修改rc引數可以修改預設的屬性,包括窗體大小、每英寸的點數、線條寬度、顏色、樣式、座標軸、座標和網路屬性、文字、字型等。

matplotlib將預設引數配置儲存在matplotlibrc檔案中,通過修改配置檔案,可修改圖示的的預設樣式。檢視預設配置的方式如下:

1)直接開啟matplotlibrc檔案

2)print(matplotlib.rc_params())

3)print(matplotlib.rcParamsDefault)

4)print(matplotlib.rcParams)

1、線條常用的rc引數

管理線條屬性的rc引數lines幾乎可以控制線條的每一個細節。

線條的常用rc引數名稱、解釋與取值

rc引數名稱 解釋 取值
lines.linewidth 線條寬度 取0~10之間的數值,預設為1.5
lines.linestyle 線條樣式 可取“-”,“—”,“-.”,“:”4中,預設為“--”
lines.marker 線條上點的形狀 可取“o”,"D","h",".",",","S"等20種,預設為None
lines.markersize 點的大小 取0~10數值,預設為1
import matplotlib as mpl

fig = plt.figure(figsize = (10,10),dpi = 80)  # 建立畫布。大小10x10,畫素80
x = np.linspace(0,1,1000)  # 通過numpy生成隨機數

# 繪製第一張子圖
fig.add_subplot(2,2,1)  # 分為2x2圖形陣,選擇第一張圖片繪圖
plt.rcParams['lines.linestyle'] = '-.'  # 修改線條型別
plt.rcParams['lines.linewidth'] = 1  # 修改線條寬度
plt.plot(x,x**2)
plt.title('y=x^2')  # 新增標題

# 繪製第二張子圖

fig.add_subplot(2,2,2)  # 分為2x2圖形陣,選擇第二張圖片繪圖
mpl.rc('lines',linestyle = '--', linewidth = 10)
plt.plot(x,x**2)
plt.title('y=x^2')  # 新增標題


# 繪製第三張子圖
fig.add_subplot(2,2,3)  # 分為2x2圖形陣,選擇第三張圖片繪圖
plt.rcParams['lines.marker'] = None
plt.rcParams['lines.linewidth'] = 3
plt.plot(x,x**2)
plt.title('y=x^2')  # 新增標題


# 繪製第四張子圖
fig.add_subplot(2,2,4)  # 分為2x2圖形陣,選擇第四張圖片繪圖
plt.rcParams['lines.linestyle'] = ':'
plt.rcParams['lines.linewidth'] = 6
plt.plot(x,x**2)
plt.title('y=x^2')  # 新增標題

plt.savefig('修改線條的rc引數.png')
plt.show()

2、座標軸常用的rc引數

同樣,管理座標軸屬性的rc引數axes也能控制座標軸的任意細節。

rc引數名稱 解釋 取值
axas.facecolor 背景顏色 接收顏色簡寫字元。預設為“W”
axas.edgecolor 邊線顏色 接收顏色簡寫字元。預設為“k”
axas.linewidth 軸線寬度 接收0~1的float。預設為0.8
axas.grid 新增網格 接收bool。預設為False
axas.titlesize 標題大小 接收‘small’,‘medium’,'large'。預設為‘large’
axas.labelsize 軸標大小 接收‘small’,‘medium’,'large'。預設為‘medium’
axas.lablelcolor 軸標顏色 接收顏色簡寫字元。預設為“k”
axas.spines.{left,botton,top,tight} 新增座標軸 接收bool。預設為True
axas.{x,y}margin 軸餘留 接收float。預設為0.05

原軸:

x = np.linspace(0,10,1000)
plt.plot(x, np.sin(x))
plt.show()

修改rc引數之後的軸:

x = np.linspace(0,10,1000)
plt.rcParams['axes.edgecolor'] = 'b'  # 軸顏色設定為藍色
plt.rcParams['axes.grid'] = True  # 新增網格
plt.rcParams['axes.spines.top'] = False  # 去除頂部軸
plt.rcParams['axes.spines.right'] = False  # 去除右側軸
plt.rcParams['axes.xmargin'] = 0.1  # x軸餘留為區間長度的0.1倍
plt.plot(x, np.sin(x))
plt.show()

3、字型常用的rc引數

其實用到現在,可能有些同學已經發現,預設的pyplot字型,並不支援中文字元,因此需要通過修改font.sans-serif引數來修改繪圖時的字型,使得圖形可以正常顯示中文。同時由於修改字型後會導致座標軸中負號無法正常顯示,因此需要同時修改axes.uncode_minus引數。

rc引數名稱 解釋 取值
font.family 字型族,每一族對應多種字型 接收serif、sans-serif、cursive、fantasy、monospace五種。預設為sans-serif
font.style 字型風格 接收normal(roman)、italic、oblique三種,預設為normal
font.variant 字型變化 接收normal或small-caps。預設為normal
font.widget 字型重量 接收normal、bold、bolder、lighter四種及100、200、…、900.預設為nomal
font.stretch 字型延伸
font.size 字型大小 接收float。預設為10

windows設定中文字型:

plt.rcParams['font.sans-serif'] = ['SimHei']  # 設定中文字型
plt.rcParams['axes.unicode_minus'] = False

mac設定中文字型:

plt.rcParams["font.family"] = 'Arial Unicode MS'

2.4、折線圖

折線圖是將"散點"按照橫座標順序用線段依次連線起來的圖形。以折線的上升或下降表示某一特徵隨另外一特徵變化的增減以及總體變化趨勢。一般用於展現某一特徵隨時間的變化趨勢。

plot函式常用引數及其說明

引數 說明
x,y 分別表示x軸和y軸的資料。無預設值
color 接收特定str,指定線條的顏色。預設為None
linestyle 接收特定str,指定線條型別。預設為 “-”
marker 接收特定str,表示繪製的點的形狀。預設為None
alpha 接收0~1的小說,表示點的透明度。預設為None

其中color引數的8種常用顏色的縮寫。

顏色縮寫 代表的顏色
b 藍色
g 綠色
r 紅色
c 青色
m 品紅
y 黃色
k 黑色
w 白色
plt.plot([0,3,9,15,30],linestyle = '-.',color = 'r',marker = 'o') 

axis函式

plt.plot(y.cumsum())

plt.grid(True)
plt.axis('image')

執行結果:

接下來主要介紹axis函式的一些引數:

引數 描述
Empty 返回當前座標軸限值
off 關閉座標軸線和標籤
equal 使用等刻度
scaled 通過尺寸變化平衡刻度
tight 使所有資料可見(縮小限值)
image 使所有資料可見(使用資料限值)
[xmin,xmax,ymin,ymax] 將設定限制為給定的(一組)值

2.2、二維資料集

一維資料繪圖只能說是一種特例,一般來說,資料集包含多個單獨的子集。這些資料的處理也是同樣遵循matplotlib處理一維資料時的原則。但是,這種情況會出現一些其他的問題,例如,兩個資料集它們可能會有不同的刻度,無法用相同的y或者x軸刻度進行繪製,還有可能希望以不同的方式視覺化兩組不同的資料,例如,一組資料使用線圖,另一組使用柱狀圖。

接下來,首先生成一個二維樣本資料。

np.random.seed(2000)
y = np.random.standard_normal((20,2)).cumsum(axis=0)

以上程式碼生成的是一個包含標準正態分佈隨機數的20*2的ndarray陣列,如下:

array([[ 1.73673761,  1.89791391],
       [-0.37003581,  1.74900181],
       [ 0.21302575, -0.51023122],
       [ 0.35026529, -1.21144444],
       [-0.27051479, -1.6910642 ],
       [ 0.93922398, -2.76624806],
       [ 1.74614319, -3.05703153],
       [ 1.52519555, -3.22618757],
       [ 2.62602999, -3.14367705],
       [ 2.6216544 , -4.8662353 ],
       [ 3.67921082, -7.38414811],
       [ 1.7685707 , -6.07769276],
       [ 2.19296834, -6.54686084],
       [ 1.18689581, -7.46878388],
       [ 1.81330034, -7.11160718],
       [ 1.79458178, -6.89043591],
       [ 2.49318589, -6.05592589],
       [ 0.82754806, -8.95736573],
       [ 0.77890953, -9.00274406],
       [ 2.25424343, -9.51643749]])

將這樣的二維陣列傳遞給plot函式,他將自動把包含的資料解釋為單獨的資料集。

plt.figure(figsize=(7,4))
plt.plot(y,lw=1.5)
plt.plot(y,"rd")
plt.axis('tight')

像這種資料肯定就是看的一頭亂麻,所以說我們需要將它進一步做一下注釋,為了讓我們能更好的理解圖表。

plt.figure(figsize=(7,4))

# 分別為兩條資料新增圖例
plt.plot(y[:,0],lw=1.5,label='1st')  
plt.plot(y[:,1],lw=1.5,label='2nd')
plt.plot(y,"rd")
plt.grid(True)  # 網格設定
plt.legend(loc=0)  # 圖例標籤位置設定
plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.title('test1')

通過剛才的操作我們也能夠發現,雖然我們傳進的是一個ndarray陣列,但是它是一個二維陣列,所以我們要想將資料全部展示出來就可以使用上面那種方式,但是上面的資料刻度都是相差無幾的,如果說某一維的資料非常大,而另外一維的則都是一些小資料,那要怎麼辦呢。

首先先來看看會造成什麼樣的結果:

y[:,0] = y[:,0] * 100
plt.figure(figsize=(7,4))
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,1],lw=1.5,label='2nd')
plt.plot(y,"rd")
plt.grid(True)  # 網格設定
plt.legend(loc=0)  # 圖例標籤位置設定
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('value')
plt.title("test2")

執行結果:

第一個資料由於資料量大,所以在這麼大的刻度上依然可以將資料顯示比較好辨認,而第二個資料就會因為這個原因看起來像一條直線,我們已經不能通過影象觀察它的資料效果。

處理方式:

  • 使用兩個y軸(一左一右)
  • 使用兩個子圖

首先先來看第一種方法:

fig,ax1 = plt.subplots()
# 第一組資料
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],"rd")
plt.grid(True)  # 網格設定
plt.legend(loc=8)  # 圖例標籤位置設定
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('value 1st')

# 第二組資料
ax2 = ax1.twinx()
plt.plot(y[:,1],'g',lw=1.5,label='2nd')
plt.plot(y[:,1],'bd')
plt.legend(loc=0)
plt.ylabel("value 2nd")

plt.title("test3")

執行結果:

這是通過在一張圖上通過不同的刻度來展示不同的資料。

第二種方式:

plt.figure(figsize=(7,5))
plt.subplot(211)  # 指定子圖位置,三個引數:行數、列數、子圖編號
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],"rd")
plt.grid(True)  # 網格設定
plt.legend(loc=0)  # 圖例標籤位置設定
plt.axis("tight")
plt.ylabel('value')

plt.title("test4")

plt.subplot(212)
plt.plot(y[:,1],'g',lw=1.5,label='2nd')
plt.plot(y[:,1],'rd')
plt.grid(True)  # 網格設定
plt.legend(loc=0)  # 圖例標籤位置設定
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('value')

執行結果:

以上操作都是通過折線圖來實現的,但是在matplotlib當中還支援很多種型別的影象。

2.3、plt物件支援的圖型別

函式 說明
plt.plot(x,y,fmt) 座標系
plt.boxplot(data,notch,position) 箱型圖
plt.bar(left,height,width,bottom) 柱狀圖
plt.barh(width,bottom,left,height) 橫向柱狀圖
plt.polar(theta,r) 極座標系
plt.pie(data,explode) 餅圖
plt.psd(x,NFFT=256,pad_to,Fs) 功率譜密度圖
plt.specgram(x,NFFT=256,pad_to,F) 譜圖
plt.cohere(x,y,NFFT=256,Fs) X-Y相關性函式
plt.scatter(x,y) 散點圖
plt.step(x,y,where) 步階圖
plt.hist(x,bins,normed) 直方圖

2.3.1、柱狀圖

# 柱狀圖
data = [12,34,23,54]
labels = ['Jan','Fed','Mar','Apr']
plt.xticks([0,1,2,3],labels)  # 設定x軸刻度
plt.bar([0,1,2,3],data)    

# 橫向柱狀圖
data = [12,34,23,54]
labels = ['Jan','Fed','Mar','Apr']
plt.yticks([0,1,2,3],labels)
plt.barh([0,1,2,3],data)    

# DataFrame陣列圖
df = pd.DataFrame({
    'Jan':pd.Series([1,2,3],index=['a','b','c']),
    'Fed':pd.Series([4,5,6],index=['b','a','c']),
    'Mar':pd.Series([7,8,9],index=['b','a','c']),
    'Apr':pd.Series([2,4,6],index=['b','a','c'])
})

df.plot.bar()  # 水平柱狀圖,將每一行中的值分組到並排的柱子中的一組
df.plot.barh(stacked=True,alpha=0.5)  # 橫向柱狀圖,將每一行的值堆積到一起

2.3.2、餅圖

餅圖用於表示不同類別的佔比情況,通過弧度大小來對比各種類別。餅圖將一個圓餅按照類別的佔比劃分成多個區塊,整個圓餅代表資料的總量,每個區塊表示該分類佔總體的比例大小。餅圖可以比較清楚地反映出部分與部分、部分與整體之間的比例關係,易於比例每個類別相對於總數的大小。但在對於面積大小的不敏感的情況下效果不是很好。

# 餅圖
plt.pie([10,20,30,40],labels=list('abcd'),autopct="%.2f%%",explode=[0.1,0,0,0])  # 餅圖
plt.axis("equal")
plt.show()

2.3.3、散點圖

對於二維繪圖,線圖和點圖可能是金融學中的最重要的,剛才在上面線圖已經有過簡單接觸,接下來主要介紹的就是點圖了,這種圖表型別可用於繪製一個金融時間序列的收益和另一個時間序列收益的對比。

散點圖又稱為散點分佈圖,是利用座標點(散點)的分佈形態反映特徵間的相關關係的一種圖形。實際中一般使用二維散點圖,通過散點的疏密程度和變化趨勢表示兩個特徵之間的關係。

主要有以下三個特點:

1)表現特徵之間是否存在數值或者數量的關聯趨勢,關聯趨勢是線性的還是非線性的。

2)凸顯出離群點(異常點)及其對整體的影響

3)資料量越大能發揮的作用越好。

基本語法格式:

matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,
    vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,*,data=None,**kwargs,
)

函式引數相關說明:

引數名稱 描述
x,y 接收array,表示x軸和y軸對應的·資料。無預設值
s 接收數值或者一維array,指定點的大小,一維array表示每個點的大小。預設為None
c 接收顏色或者一堆array,指定點的顏色,一維array表示每個點的顏色。預設為None
marker 接收特定str,表示繪製的點的形狀。預設為None
alpha 接收0~1的小數,表示點的透明度。預設為None
y = np.random.standard_normal((1000,2))  # 生成正態分佈的二維隨機陣列
c = np.random.randint(0,10,len(y))

plt.figure(figsize=(7,5))
plt.scatter(y[:,0],y[:,1],c=c,marker='o')  # 通過scatter函式加入第三維資料
plt.colorbar()  # 通過彩條對不用演示資料進行描述
plt.grid(True)
plt.xlabel('1st')
plt.ylabel('2nd')
plt.title("test5")

執行結果:

2.3.4、直方圖

plt.figure(figsize=(7,4))
plt.hist(y,label=['1st','2nd'],bins=25)
plt.grid(True)  # 網格設定
plt.legend(loc=0)  # 圖例標籤位置設定
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('frequency')
plt.title("test6")

執行結果:

直方圖是金融應用當中比較常用的圖表型別,接下來主要介紹一下plt.hist的使用方法以及它的引數說明

plt.hist(
    ['x', 'bins=None', 'range=None', 'density=None', 'weights=None', 'cumulative=False', 'bottom=None', "histtype='bar'", "align='mid'", "orientation='vertical'", 'rwidth=None', 'log=False', 'color=None', 'label=None', 'stacked=False', 'normed=None', '*', 'data=None', '**kwargs'],
)
引數 描述
x 列表物件,ndarray物件
bins 資料組(bin)數
range 資料組的上界和下界
normed 規範化為整數1
weights x軸上每個值的權重
cumulative 每個資料組包含較低組別的計數
histtype 選項:bar,barstacked,step,stepfilled
align 選項:left,mid,right
orientation 選項:horizontal,vertical
rwidth 條塊的相對寬度
log 對數刻度
color 每個資料集的顏色
label 標籤所用的字串或者字串序列
stacked 堆疊多個數據集

2.3.5、箱型圖

箱型圖可以簡潔地概述資料集的特性,可以很容易的比較多個數據集。

fig,ax = plt.subplots(figsize=(7,4))
plt.boxplot(y)
plt.grid(True)
plt.setp(ax,xticklabels=['1st','2nd'])
plt.xlabel('data set')
plt.ylabel("value")
plt.title("test7")

執行結果:

2.3.6、補充:繪製數學函式

以圖形的方式說明某個下限和上限之間函式影象下方區域的面積,簡而言之就是,從下限到上限之間函式積分值

# 第一步:定義求取積分的函式
def func(x):
    return 0.5 * np.exp(x) + 1   # 指數函式

# 第二步:定義積分割槽間,生成必須得數值
a, b = 0.5 , 1.5
x = np.linspace(0,2)
y = func(x)

# 第三步:繪製函式影象
fig, ax = plt.subplots(figsize=(7,5))
plt.plot(x,y,'b',linewidth=2)
plt.ylim(ymin=0)

# 第四步:使用Polygon函式生成陰影部分,表示積分面積
Ix = np.linspace(a, b)
Iy = func(Ix)
verts = [(a,0)] + list(zip(Ix, Iy)) + [(b, 0)]
poly = plt.Polygon(verts,facecolor='0.7',edgecolor='0.5')
ax.add_patch(poly)

# 第五步:使用plt.text和plt.figtext在圖表上新增數學公式和一些座標軸標籤
plt.text(0.5 * (a + b),1,r"$\int_a^b f(x)\mathrm{d}x$",horizontalalignment='center',fontsize=20)
plt.figtext(0.9, 0.075, "$x$")
plt.figtext(0.075,0.9,"$f(x)$")

# 第六步:設定刻度標籤以及新增網格
ax.set_xticks((a, b))
ax.set_xticklabels(('$a$', '$b$'))
ax.set_yticks([func(a), func(b)])
ax.set_yticklabels(('$f(a)$', '$f(b)$'))
plt.grid(True)

執行結果:


[ \int_a^bf(x)dx ]

3、金融學圖表

以上繪製出來的資料都是一些常用的資料影象,但是在金融行業會有一些獨有的影象,之前在matplotlib當中還提供了少量的特殊金融圖表,這些圖表,就例如燭柱圖,主要是用於視覺化歷史股價資料或者類似的金融時間序列。

現在這個方法已經獨立出來自成一個模組了mpl_finance

anaconda中mpl_finance安裝方式:

將https://github.com/matplotlib/mpl_finance/archive/master.zip下載到本地

在anaconda環境中執行命令:pip install 本地路徑/mpl_finance-master.zip

呼叫方式:

import mpl_finance as mpf

import matplotlib.pyplot as plt
import mpl_finance as mpf
import tushare as ts
import pandas as pd
from matplotlib.pylab import date2num
from dateutil.parser import parse
import numpy as np
import matplotlib.dates as mdate

data = ts.get_k_data('000001')  # 獲取平安的k線資料
data_of = data[:60]  # 只取前60份資料

fig, ax = plt.subplots(figsize=(15, 7))
__colorup__ = "r"
__colordown__ = "g"

# 圖表顯示中文
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']

qutotes = []
for index, (d, o, c, h, l) in enumerate(
        zip(data_of.date, data_of.open, data_of.close,
            data_of.high, data_of.low)):
    
    # 時間需要通過date2num轉換為浮點型
    d = date2num(parse(d))
    # 日期,開盤,收盤,最高,最低組成tuple物件val
    val = (d, o, c, h, l)
    # 加val加入qutotes
    qutotes.append(val)

# 使用mpf.candlestick_ochl進行蠟燭繪製,ochl代表:open,close,high,low
mpf.candlestick_ochl(ax, qutotes, width=0.8, colorup=__colorup__,colordown=__colordown__)

#設定x軸為時間格式,否則x軸顯示的將是類似於‘736268’這樣的轉碼後的數字格式
ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))

plt.xticks(pd.date_range('2016-08-01','2016-11-30',freq='W'),rotation=60)
plt.grid(True)  # 網格設定
plt.title("k線圖")
ax.autoscale_view()
ax.xaxis_date()

4、儲存圖表到檔案

plt.savafig('檔名.拓展名')

檔案型別是通過副檔名推斷出來的。因此,如果你使用的是.pdf,就會得到一個PDF檔案。

plt.savefig('123.pdf')

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

from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()
引數 說明
fname 含有檔案路徑的字串或者Python的檔案型物件。
dpi 影象解析度,預設為100
format 顯示設定檔案格式("png","jpg","pdf","svg","ps",...)
facecolor、edgecolor 背景色,預設為"W"(白色)
bbox_inches 圖表需要儲存的部分。設定為”tight“,則嘗試剪除圖表周圍空白部分
  • Bokeh - Python的互動式網路繪圖.
  • Seaborn - 使用Matplotlib的統計資料視覺化.