参照pyecharts-gallery示例代码分容易能完成图形的展示,不过这里也有一点小坑。这里记录下折线图和柱状图的使用。便于说事,这里使用了tushare的stock数据源。先看下效果图:

echart-bar-line
echart-bar-line

一、折线图

单根线的折线图是比较容易搞的,这里说多根线的折线图,我这里使用的代码如下:

 1import pyecharts.options as opts
 2from pyecharts.charts import Line
 3import talib as ta
 4import tushare as ts
 5dw = ts.get_k_data('603515')
 6df = dw[-30:]
 7x_data = df['date'].values
 8x_data = df['date'].values
 9#y_data = [820, 932, 901, 934, 1290, 1330, 1320]
10line = (
11    Line()
12    .add_xaxis(xaxis_data=x_data)
13    .add_yaxis(
14        series_name="开",
15        y_axis=df['open'].values,
16        label_opts=opts.LabelOpts(is_show=False),
17    )
18    .add_yaxis(
19        series_name="收",
20        y_axis=df['close'].values,
21        label_opts=opts.LabelOpts(is_show=False),
22    )
23    .add_yaxis(
24        series_name="高",
25        y_axis=df['high'].values,
26        label_opts=opts.LabelOpts(is_show=False),
27        areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
28    )
29    .add_yaxis(
30        series_name="低",
31        y_axis=df['low'].values,
32        label_opts=opts.LabelOpts(is_show=False),
33        areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
34    )
35    .set_global_opts(
36        tooltip_opts=opts.TooltipOpts(
37            is_show=True, trigger="axis", axis_pointer_type="cross"
38        ),
39        yaxis_opts=opts.AxisOpts(
40            type_="value",
41            axistick_opts=opts.AxisTickOpts(is_show=True),
42            splitline_opts=opts.SplitLineOpts(is_show=True),
43        ),
44        xaxis_opts=opts.AxisOpts(
45            type_="category",
46            boundary_gap=False,
47            axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
48        ),
49    )
50   # .render("stacked_line_chart.html")
51)
52line.render_notebook()

这里是根据官方 stacked_line_chart.py 示例的基础上修改出来的。使用官方示例有一个问题。其在增加 y 轴值的时候,加了一个参数 stack=”总量” ,使用该参数后,后面每根线的值会和前面一根线的各个点的值求和再显示。有这个场景比较适合使用这个选项,就是CPU利用率,不过这显然我的需求不一样,把这个值拿掉就好了。

上面使用示例中还有两个参数也说明下:

1label_opts=opts.LabelOpts(is_show=False),  //控制是否在线上显示各个点的值
2areastyle_opts=opts.AreaStyleOpts(opacity=0.5), //控制是否以颜色区域显示某根线

二、柱状图

根据官方示例,这里先写一个柱状图的示例:

 1import tushare as ts
 2import pyecharts.options as opts
 3from pyecharts.charts import Bar, Line
 4dw = ts.get_k_data('603515')
 5df = dw[-30:]
 6x_data = df['date'].values
 7bar = (
 8    Bar()
 9    .add_xaxis(list(x_data))
10    .add_yaxis("开", list(df['open'].values),label_opts=opts.LabelOpts(is_show=False))
11    .add_yaxis("收", list(df['close'].values),label_opts=opts.LabelOpts(is_show=False))
12)
13bar.render_notebook()

这里有一个坑就是,默认tushare取回的每一列值的数据类型是numpy类型的,而从官方示例上可以看出,其需要引入的是列表类型,所以需要list(npdata) 或npdata.to_list()进行数据转换,不然不能正常显示柱状图,这点和折线图不同,折线图不转换也可以正常显示。

三、柱状图和折线图混用

这部分可以参考官方示例:mixed_bar_and_line ,我这里具体实现的代码如下:

 1import tushare as ts
 2import pyecharts.options as opts
 3from pyecharts.charts import Bar, Line
 4dw = ts.get_k_data('603515')
 5df = dw[-30:]
 6x_data = df['date'].values
 7bar = (
 8    Bar()
 9    .add_xaxis(list(x_data))
10    .add_yaxis("开", list(df['open'].values),label_opts=opts.LabelOpts(is_show=False))
11    .add_yaxis("收", list(df['close'].values),label_opts=opts.LabelOpts(is_show=False))
12)
13#bar.render_notebook()
14line = (
15    Line()
16    .add_xaxis(xaxis_data=x_data)
17    .add_yaxis(
18        series_name="高",
19        #线上不显示数值
20        label_opts=opts.LabelOpts(is_show=False),
21        y_axis=df['high'].values,
22    )
23    .add_yaxis(
24        series_name="低",
25        label_opts=opts.LabelOpts(is_show=False),
26        #是否显示阴影
27        #areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
28        y_axis=df['low'].values,
29    )
30    .set_global_opts(
31    tooltip_opts=opts.TooltipOpts(
32        is_show=True, trigger="axis", axis_pointer_type="cross"
33    ),
34    yaxis_opts=opts.AxisOpts(
35        type_="value",
36        axistick_opts=opts.AxisTickOpts(is_show=True),
37        splitline_opts=opts.SplitLineOpts(is_show=True),
38    ),
39    xaxis_opts=opts.AxisOpts(
40        type_="category",
41        boundary_gap=False,
42        axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
43    ),
44  )
45)
46#line.render_notebook()
47bar.overlap(line).render_notebook()

效果图见最开始的图示。这里混使用主机使用bar.overlap(line)这样的用法。不过上图只是简单的展示,并没有标题,也没有y轴的单位名称,同时在鼠标移动时,也没有参考线,这些也可以参考官方示例进行配置,具体可以根据如下代码进行修改:

 1.set_global_opts(
 2    tooltip_opts=opts.TooltipOpts(
 3        is_show=True, trigger="axis", axis_pointer_type="cross"
 4    ),
 5    xaxis_opts=opts.AxisOpts(
 6        type_="category",
 7        axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
 8    ),
 9    yaxis_opts=opts.AxisOpts(
10        name="水量",
11        type_="value",
12        min_=0,
13        max_=250,
14        interval=50,
15        axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
16        axistick_opts=opts.AxisTickOpts(is_show=True),
17        splitline_opts=opts.SplitLineOpts(is_show=True),
18    ),
19)