Skip to content
On this page

技术指标可视化-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版本的同学有所帮助。