Appearance
技术指标可视化-pyecharts从V0.5至V1版的转变
pyecharts从V0.5至V1版的转变
前言
不少同学反映说安装了pyecharts,但是例程中的很多接口不兼容了。对此,我们特地去pyecharts官网查看了下,发现pyecharts确实升级了版本,而且改动还挺大。那么我们特地增加这一小节,来对比梳理下新旧两类版本的区别。
v0.5.x 和 v1 区别概述
pyecharts 分为 v0.5.x 和 v1 两个大版本,v0.5.x 版本将不再进行维护,v1是新版本系列,从 v1.0.0 开始,很不幸的是v0.5.x 和 v1 间不兼容。
本小册的例程最初是基于pyecharts 0.5.11版本编写的,目前pyecharts已更新至为1.7.0版本,两个版本使用方法差别较大。
同学们可以使用pip工具指定版本方式安装0.5.11【pip install pyecharts==0.5.11】,这样就能顺利运行本小节的例程。
另外,为便于使用v1 版本的同学移植,我们选几个典型例程介绍下v0.5.x 和 v1 两个版本使用上的区别,并提供基于1.7.0版本的例程代码,供大家参考,更详细的使用方法可参考pyechart官网介绍。
接下来我们介绍下v0.5.x 和 v1 这两个版本在本小节例程上的使用区别:
包的导入方式发生了变化。
v1 版本支持链式调用写法的。
v1 版本所有配置项均 OOP,一切皆 Options,因此支持 Opts 配置项作为参数传入。
将add() 接口拆分,对于有 XY 轴的图表,拆分为 add_xaixs()/add_yaxis() 方法。新增 set_series_opts 方法,用于一次性设置所有 series 配置项。新增 set_base_opts 方法,用于设置 base 配置项,如 dataZoom, legend, tooltip, toolbox 等。
废除 Overlap 组合图表,改为 chart.overlap() 方法,仅部分图表实现了该方法。
0.5.X 版本写法如下:
from pyecharts import Kline
kline = Kline("K 线图示例")
#普通显示K线
#kline.add("日K", ["2018/9/{}".format(i + 1) for i in range(30)], v1)
#is_datazoom_show=True 图表数据缩放 指定 markLine 位于开盘或者收盘上
kline.add("日K", ["2018/9/{}".format(i + 1) for i in range(30)], v1, is_datazoom_show=True,\
mark_line=["max"], mark_point=["max"])
kline.show_config()
kline.render(r'k.html')
v1 版本写法如下:
from pyecharts import options as opts
from pyecharts.charts import Kline
c = (
Kline()
.add_xaxis(["2018/9/{}".format(i + 1) for i in range(31)])
.add_yaxis(
"kline",
v1,
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="max", value_dim="close")]
),
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(is_scale=True),
yaxis_opts=opts.AxisOpts(
is_scale=True,
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
datazoom_opts=[opts.DataZoomOpts(type_="inside")],
title_opts=opts.TitleOpts(title="K线图示例"),
)
.render(r'k.html') # raw string 非转义 string
)
V1版本图表集成
使用V1.7.0版本将Kline和Line合并在一个图表中,图形共用同一个x和y坐标轴。再将结合后的图表与Bar共同放入Grid类中形成两个图表。完整代码如下所示:
# Overlap+Grid方法绘制交易行情界面
from pyecharts.charts import Grid, Line, Bar, EffectScatter, Kline # newest 1.7.0
# example1 senior quotations
df_stockload = web.DataReader("000001.SS", "yahoo", datetime.datetime(2018, 1, 1), datetime.date.today())
df_stockload['Ma20'] = df_stockload.Close.rolling(
window=20).mean() # pd.rolling_mean(df_stockload.Close,window=20)
df_stockload['Ma30'] = df_stockload.Close.rolling(
window=30).mean() # pd.rolling_mean(df_stockload.Close,window=30)
df_stockload['Ma60'] = df_stockload.Close.rolling(
window=60).mean() # pd.rolling_mean(df_stockload.Close,window=60)
volume_rise = [df_stockload.Volume[x] if df_stockload.Close[x] > df_stockload.Open[x] else "0" for x in
range(0, len(df_stockload.index))]
volume_drop = [df_stockload.Volume[x] if df_stockload.Close[x] <= df_stockload.Open[x] else "0" for x in
range(0, len(df_stockload.index))]
ohlc = list(zip(df_stockload.Open, df_stockload.Close, df_stockload.Low, df_stockload.High))
dates = df_stockload.index.strftime('%Y-%m-%d')
kline = (
Kline()
.add_xaxis(dates.tolist())
.add_yaxis(
"kline",
ohlc,
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="max", value_dim="close")] # 标注最大值线
),
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
xaxis_opts=opts.AxisOpts(is_scale=True, is_show=False),
yaxis_opts=opts.AxisOpts(is_scale=True,
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
)
),
legend_opts=opts.LegendOpts(orient="vertical", pos_top="20%", pos_right="0%"), # 调整图例的位置
title_opts=opts.TitleOpts(title="行情显示图"),
)
)
line = (
Line()
.add_xaxis(dates.tolist())
.add_yaxis("Ma20", df_stockload["Ma20"].tolist())
.add_yaxis("Ma30", df_stockload["Ma30"].tolist())
.add_yaxis("Ma60", df_stockload["Ma60"].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
bar = (
Bar()
.add_xaxis(dates.tolist())
.add_yaxis("rvolume", volume_rise, stack="stack1", category_gap="50%") # 堆积柱形图
.add_yaxis("dvolume", volume_drop, stack="stack1", category_gap="50%") # 堆积柱形图
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
#xaxis_index=[0, 1] 同时显示两幅图
.set_global_opts(datazoom_opts=[opts.DataZoomOpts(xaxis_index=[0,1], is_show= True)], # 图表数据缩放
legend_opts=opts.LegendOpts(orient="vertical", pos_right="0%")
)
)
overlap_1 = kline.overlap(line)
grid = (
Grid()
.add(bar, grid_opts=opts.GridOpts(pos_top="60%"), grid_index=0)
.add(overlap_1, grid_opts=opts.GridOpts(pos_bottom="40%"), grid_index=1)
.render(r"grid_vertical.html") # raw string 非转义 string
)
总结
两个版本使用方法上的区别就介绍到这里了,希望对已经安装了v1版本的同学有所帮助。