數據可視化之Matplotlib的使用

一、什麼是數據可視化

數據可視化在量化分析當中是一個很是關鍵的輔助工具,每每咱們須要經過可視化技術,對咱們的數據進行更清晰的展現,這樣也能幫助咱們理解交易、理解數據。經過數據的可視化也能夠更快速的發現量化投資中的一些問題,更有利於分析並解決它們。接下來咱們主要使用的可視化工具包叫作——Matplotlib,它是基於Numpy和tkinter二次開發的,它是一個強大的Python繪圖和數據可視化的工具包。html

二、Matplotlib的用法

2.一、Matplotlib繪圖基礎

安裝方式:python

pip install matplotlibgit

引用方法:github

import matplotlib.pyplot as pltcanvas

matplotlib是python中的2D繪圖庫,也是目前使用最普遍的python繪圖庫。雖然它很龐大,可是能夠經過簡單的概念框架和重要的知識來理解掌握。它的圖像大概能夠分爲如下4層結構。windows

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

2)figure(畫布):創建在canvas之上,從這一層就能夠開始設置參數數組

3)axes(子圖):將figure分紅不一樣的塊,實現分面繪圖網絡

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

2.二、繪圖基本流程

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

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.三、繪圖風格

在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.四、動態rc參數

pyplot模塊使用rc配置文件來自定義圖形的各類默認屬性,稱爲rc配置或rc參數。經過修改rc參數能夠修改默認的屬性,包括窗體大小、每英寸的點數、線條寬度、顏色、樣式、座標軸、座標和網絡屬性、文本、字體等。

matplotlib將默認參數配置保存在matplotlibrc文件中,經過修改配置文件,可修改圖標的的缺省樣式。查看默認配置的方式以下:

1)直接打開matplotlibrc文件

2)print(matplotlib.rc_params())

3)print(matplotlib.rcParamsDefault)

4)print(matplotlib.rcParams)

一、線條經常使用的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()

修改線條的rc參數

二、座標軸經常使用的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()

修改rc

三、字體經常使用的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.四、折線圖

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

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')

matplot2

axis函數

plt.plot(y.cumsum())

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

運行結果:

img

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

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

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')

img

像這種數據確定就是看的一頭亂麻,因此說咱們須要將它進一步作一下注釋,爲了讓咱們能更好的理解圖表。

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')

img

經過剛纔的操做咱們也可以發現,雖然咱們傳進的是一個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")

運行結果:

img

第一個數據因爲數據量大,因此在這麼大的刻度上依然能夠將數據顯示比較好辨認,而第二個數據就會由於這個緣由看起來像一條直線,咱們已經不能經過圖像觀察它的數據效果。

處理方式:

  • 使用兩個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")

運行結果:

img

這是經過在一張圖上經過不一樣的刻度來展現不一樣的數據。

第二種方式:

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')

運行結果:

img

以上操做都是經過折線圖來實現的,可是在matplotlib當中還支持不少種類型的圖像。

2.三、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.一、柱狀圖

# 柱狀圖
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.二、餅圖

餅圖用於表示不一樣類別的佔比狀況,經過弧度大小來對比各類類別。餅圖將一個圓餅按照類別的佔比劃分紅多個區塊,整個圓餅表明數據的總量,每一個區塊表示該分類佔整體的比例大小。餅圖能夠比較清楚地反映出部分與部分、部分與總體之間的比例關係,易於比例每一個類別相對於總數的大小。但在對於面積大小的不敏感的狀況下效果不是很好。

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

餅圖

2.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")

運行結果:

img

2.3.四、直方圖

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")

運行結果:

img

直方圖是金融應用當中比較經常使用的圖表類型,接下來主要介紹一下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.五、箱型圖

箱型圖能夠簡潔地概述數據集的特性,能夠很容易的比較多個數據集。

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")

運行結果:

img

2.3.六、補充:繪製數學函數

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

# 第一步:定義求取積分的函數
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)

運行結果:

img [ \int_a^bf(x)dx ]

三、金融學圖表

以上繪製出來的數據都是一些經常使用的數據圖像,可是在金融行業會有一些獨有的圖像,以前在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()

img

四、保存圖表到文件

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的統計數據可視化.

原文出處:https://www.cnblogs.com/guapitomjoy/p/12212562.html

相關文章
相關標籤/搜索