mplfinance的早期版本只支持两个面板,称之为“main”和“lower”。为了向后兼容,如果任何代码通过panel=‘main’,将被翻译为panel=0,而panel='lower' 将被翻译为panel=1。新版以后建议用户使用整数来标识面板。当前版本最多可以添加9个子图,即panel<=9,否则 或报错。
添加子图
import matplotlib.pyplot as plt
import pandas as pd
import os
import talib
import mplfinance as mpf
class DataFinanceDraw(object):
"""
获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
"""
def __init__(self):
self.data = pd.DataFrame()
def my_data(self, file_name='002624.SZ.csv'):
"""
获取数据,把数据格式化成mplfinance的标准格式
"""
data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data.set_index('Date', inplace=True)
self.data = data
return data
def panel_draw(self):
"""
make_addplot 绘制多个子图
"""
data = self.data.iloc[-90:]
add_plot = [
# 参数panel即是设置添加到第几个子图
mpf.make_addplot(data, type='candle',panel=2)
]
mpf.plot(data, type='candle',
mav=(2, 5),
addplot=add_plot,
volume=True,
figscale=1.5,
title='Candle',
figratio=(16, 10),
ylabel='price',
ylabel_lower='volume',
)
plt.show() # 显示
plt.close() # 关闭plt,释放内存
if __name__ == "__main__":
candle = DataFinanceDraw()
candle.my_data('002624.SZ.csv')
candle.panel_draw()
修改子图的顺序
途中可以看到,子图的k线图在最下面,按照排序最上为主图0,下面依次为1,2,…,9。 当然你也可以打乱顺序,两个k线图对比的话,图表相连比较合适,修改如下:
import matplotlib.pyplot as plt
import pandas as pd
import os
import talib
import mplfinance as mpf
class DataFinanceDraw(object):
"""
获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
"""
def __init__(self):
self.data = pd.DataFrame()
def my_data(self, file_name='002624.SZ.csv'):
"""
获取数据,把数据格式化成mplfinance的标准格式
"""
data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data.set_index('Date', inplace=True)
self.data = data
return data
def panel_draw(self):
"""
make_addplot 绘制多个子图
"""
data = self.data.iloc[-90:]
add_plot = [
# 参数panel即是设置添加到第几个子图
mpf.make_addplot(data, type='candle',panel=1)
]
mpf.plot(data, type='candle',
mav=(2, 5),
addplot=add_plot,
volume=True,
figscale=1.5,
title='Candle',
figratio=(16, 10),
ylabel='price',
ylabel_lower='volume',
main_panel=0,
volume_panel=2,
)
plt.show() # 显示
plt.close() # 关闭plt,释放内存
if __name__ == "__main__":
candle = DataFinanceDraw()
candle.my_data('002624.SZ.csv')
candle.panel_draw()
设置子图比例和数量
仍然是上面的代码案例,只需在plot中增加两个参数panel_ratios和num_panels,panel_ratios是用了设置子图和主图的比例,参数的顺序是按图序号来设置的,例如:panel_ratios(1,0.3,0.8) 即0号图比例是1,1号图比例是0.3,2号图是0.8,只是注意:是按面板的序号而并非第一个就是主图比例,因为0号面板默认是主图但不一定必然是主图!!可以通过main_panel = 2 将主图改变序号。 num_panels是用了显式设置有几个子图,这个用到的会比较少,比如我们只添加了两个子图,而num_panels设置为4,那么就会有一个空白图,而这里有个小坑就是,一旦设置了num_panels的数量,那么panel_ratios的参数个数必须与之对应,否则会报错:
import matplotlib.pyplot as plt
import pandas as pd
import os
import talib
import mplfinance as mpf
class DataFinanceDraw(object):
"""
获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
"""
def __init__(self):
self.data = pd.DataFrame()
def my_data(self, file_name='002624.SZ.csv'):
"""
获取数据,把数据格式化成mplfinance的标准格式
"""
data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data.set_index('Date', inplace=True)
self.data = data
return data
def panel_draw(self):
"""
make_addplot 绘制多个子图
"""
data = self.data.iloc[-90:]
add_plot = [
# 参数panel即是设置添加到第几个子图
mpf.make_addplot(data, type='candle',panel=1)
]
mpf.plot(data, type='candle',
mav=(2, 5),
addplot=add_plot,
volume=True,
figscale=1.5,
title='Candle',
figratio=(16, 10),
ylabel='price',
ylabel_lower='volume',
main_panel=0,
volume_panel=2,
panel_ratios=(1, 0.3, 0.8, 0.5),
num_panels=4,
)
plt.show() # 显示
plt.close() # 关闭plt,释放内存
if __name__ == "__main__":
candle = DataFinanceDraw()
candle.my_data('002624.SZ.csv')
candle.panel_draw()
绘制macd子图
import matplotlib.pyplot as plt
import pandas as pd
import os
import talib
import mplfinance as mpf
class DataFinanceDraw(object):
"""
获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
"""
def __init__(self):
self.data = pd.DataFrame()
def my_data(self, file_name='002624.SZ.csv'):
"""
获取数据,把数据格式化成mplfinance的标准格式
"""
data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data.set_index('Date', inplace=True)
self.data = data
return data
def append_macd(self):
"""
使用talib计算macd数据
"""
data = self.data
data['macd_dif'], data['macd_dea'], data['macd_macd'] = talib.MACD(data['Close'], fastperiod=12,
slowperiod=26, signalperiod=9)
data['macd_macd'] = 2 * data['macd_macd']
self.data = data
return data
def panel_draw(self):
"""
make_addplot 绘制多个子图
"""
data = self.data.iloc[-120:]
add_plot = [
mpf.make_addplot(data['macd_macd'], type='bar', width=0.7, panel=2, color='dimgray', alpha=1,
secondary_y=False),
mpf.make_addplot(data['macd_dif'], panel=2, color='fuchsia', secondary_y=True),
mpf.make_addplot(data['macd_dea'], panel=2, color='b', secondary_y=True)
]
mpf.plot(data, type='candle',
mav=(2, 5),
addplot=add_plot,
volume=True,
figscale=1.5,
title='Candle',
figratio=(16, 10),
ylabel='price',
ylabel_lower='volume',
)
plt.show() # 显示
plt.close() # 关闭plt,释放内存
if __name__ == "__main__":
candle = DataFinanceDraw()
candle.my_data('002624.SZ.csv')
candle.append_macd()
candle.panel_draw()
这里只是一个macd的简单实例,如果你想要更漂亮的效果,比如macd柱线在0轴上下方不同颜色,或者在变长时一种颜色缩短时一种颜色,这些都是数据处理的问题了,把上面的柱线数据histogram按0分为两组数据即可,分组的时候注意为保证x轴坐标相同,分组后缺失的数据用0填充,make_addplot添加数据时多添加一组数据设置不同颜色即可。这里以按0轴上下分色为例修改代码,其他风格以此类推。 修改部分代码如下:
import matplotlib.pyplot as plt
import pandas as pd
import os
import talib
import mplfinance as mpf
import numpy as np
class DataFinanceDraw(object):
"""
获取数据,并按照 mplfinanace 需求的格式格式化,然后绘图
"""
def __init__(self):
self.data = pd.DataFrame()
def my_data(self, file_name='002624.SZ.csv'):
"""
获取数据,把数据格式化成mplfinance的标准格式
"""
data = pd.read_csv(os.getcwd() + '\\datas\\days\\' + file_name)
data = data[['trade_date', 'open', 'close', 'high', 'low', 'vol']]
data.columns = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume',]
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data.set_index('Date', inplace=True)
self.data = data
return data
def append_macd(self):
"""
使用talib计算macd数据
"""
data = self.data
data['macd_dif'], data['macd_dea'], data['macd_macd'] = talib.MACD(data['Close'], fastperiod=12,
slowperiod=26, signalperiod=9)
data['macd_macd'] = 2 * data['macd_macd']
self.data = data
return data
def panel_draw(self):
"""
make_addplot 绘制多个子图
"""
data = self.data.iloc[-120:]
# 使用柱状图绘制快线和慢线的差值,根据差值的数值大小,分别用红色和绿色填充
# 红色和绿色部分需要分别填充,因此先生成两组数据,分别包含大于零和小于等于零的数据
bar_r = np.where(data['macd_macd'] > 0, data['macd_macd'], 0)
bar_g = np.where(data['macd_macd'] <= 0, data['macd_macd'], 0)
add_plot = [
mpf.make_addplot(data['macd_dea'], panel=2, color='b', secondary_y=False),
mpf.make_addplot(data['macd_dif'], panel=2, color='fuchsia', secondary_y=True),
# 使用柱状图填充(type='bar'),设置颜色分别为红色和绿色
mpf.make_addplot(bar_r, type='bar', color='red', panel=2),
mpf.make_addplot(bar_g, type='bar', color='green', panel=2)
]
mpf.plot(data, type='candle',
mav=(2, 5),
addplot=add_plot,
volume=True,
figscale=1.5,
title='Candle',
figratio=(16, 10),
ylabel='price',
ylabel_lower='volume',
)
plt.show() # 显示
plt.close() # 关闭plt,释放内存
if __name__ == "__main__":
candle = DataFinanceDraw()
candle.my_data('002624.SZ.csv')
candle.append_macd()
candle.panel_draw()