- 什么是數據可視化
- 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)
運行結果:
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“,則嘗試剪除圖表周圍空白部分 |