def KlinePlotting(target_file): global trend_punishment res = pickle.load(open(target_file, 'rb')) c = (Line().add_xaxis([item[0] for item in res]).add_yaxis( "打分", [item[1] for item in res], linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), ).set_global_opts( title_opts=opts.TitleOpts(title="打分"), xaxis_opts=opts.AxisOpts(type_="category"), datazoom_opts=[ opts.DataZoomOpts( type_="slider", xaxis_index=[0], range_start=80, range_end=100, ) ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), )) gridChart = Grid(init_opts=opts.InitOpts(width="1000px", height="500px", animation_opts=opts.AnimationOpts( animation=False))) gridChart.add(c, grid_opts=opts.GridOpts(pos_left="10%", pos_right="10%")) gridChart.render("score_modified_plot_new_0.002.html")
def test_liquid_grid(fake_writer): l1 = ( Liquid() .add("lq", [0.6, 0.7], center=["60%", "50%"]) .set_global_opts(title_opts=opts.TitleOpts(title="多个 Liquid 显示")) ) l2 = Liquid().add( "lq", [0.3254], center=["25%", "50%"], label_opts=opts.LabelOpts( font_size=50, formatter=JsCode( """function (param) { return (Math.floor(param.value * 10000) / 100) + '%'; }""" ), position="inside", ), ) c = Grid().add(l1, grid_opts=opts.GridOpts()).add(l2, grid_opts=opts.GridOpts()) c.render() _, content = fake_writer.call_args[0] assert_in("center", content)
def draw_charts(fn1, fn2): df1 = pd.read_csv(fn1) df1['datetime'] = df1['date'] + ' ' + df1['time'] #print(df1.head()) kline1 = gen_kline_one(df1) df2 = pd.read_csv(fn2) df2['datetime'] = df2['date'] + ' ' + df2['time'] #print(df1.head()) kline2 = gen_kline_two(df2) grid_chart = Grid( init_opts=opts.InitOpts( width="1300px", height="700px", #animation_opts=opts.AnimationOpts(animation=False), ) ) grid_chart.add( kline1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"), ) grid_chart.add( kline2, grid_opts=opts.GridOpts( pos_left="3%", pos_right="5%", pos_top="53%", height="39%" ), ) fn = get_dss( ) + 'backtest/render/bar2.html' grid_chart.render(fn)
def html_output(self, order, view, mode): """ output function of html Args: order(int): diversified_ranking use different order view(View): view object mode(str): single or multiple Returns: None """ instance = self.instance data = {} data['order'] = order data['chartname'] = instance.table_name data['describe'] = view.table.describe data['x_name'] = view.fx.name data['y_name'] = view.fy.name data['chart'] = Chart.chart[view.chart] data['classify'] = [v[0] for v in view.table.classes] data['x_data'] = view.X data['y_data'] = view.Y data['title_top'] = 5 [chart, filename] = self.html_handle(data) grid = Grid() grid.add(chart, grid_opts=opts.GridOpts(pos_bottom='20%', pos_top='20%')) if mode == 'single': self.page.add(grid) #the grid is added in the same page elif mode == 'multiple': grid.render('./html/' + self.table_name + '/' + filename) #the grid is added in a new file
def draw(self, symbol, fn_render): fn = get_dss() + 'fut/bar/day_' + symbol + '.csv' df1 = pd.read_csv(fn) # print(df1.head()) price_min = int(df1.close.min() * 0.99) price_max = df1.close.max() kline = self.gen_kline(df1, symbol) line_cci = self.gen_cci(df1, 100) grid_chart = Grid(init_opts=opts.InitOpts( width="1390px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="60%"), ) grid_chart.add( line_cci, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="75%", height="17%"), ) grid_chart.render(fn_render)
def draw(self, symbol, fn_render): fn = get_dss() +'fut/bar/day_' + symbol + '.csv' df = pd.read_csv(fn) df1 = df.loc[:,['date','time','close']] n = 30 close_list = df.apply(lambda record: float(record['close']), axis=1).tolist() close_list = np.array(close_list) ma_arr = talib.SMA(close_list, n) df['ma'] = ma_arr df['close'] = df['close'] - df['ma'] df2 = df.loc[:,['date','time','close']] line1 = self.gen_line_one(df1, symbol) line2 = self.gen_line_two(df2) grid_chart = Grid( init_opts=opts.InitOpts( width="1300px", height="700px", #animation_opts=opts.AnimationOpts(animation=False), ) ) grid_chart.add( line1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"), ) grid_chart.add( line2, grid_opts=opts.GridOpts( pos_left="5%", pos_right="3%", pos_top="53%", height="39%" ), ) grid_chart.render(fn_render)
def test_grid_options(fake_writer): bar = _chart_for_grid() gc = Grid().add( bar, opts.GridOpts(pos_left="5%", pos_right="20%", is_contain_label=True)) gc.render() _, content = fake_writer.call_args[0] assert_in("containLabel", content)
def draw_charts(): pz = 'CF' vtSymbol = 'CF' fn = get_dss() + 'backtest/fut/' + pz + '/day_' + vtSymbol + '.csv' df1 = pd.read_csv(fn) # df1 = df1[df1.date >= '2019-01-20'] #df1['datetime'] = df1['date'] + ' ' + df1['time'] df1['datetime'] = df1['date'] price_min = int(df1.close.min() * 0.99) price_max = df1.close.max() #fn = get_dss( )+ 'fut/engine/aberration_raw/signal_aberration_raw_duo_deal_CF.csv' #fn = get_dss( )+ 'fut/engine/aberration_raw/signal_aberration_raw_kong_deal_CF.csv' fn = get_dss( ) + 'fut/engine/aberration_enhance/signal_aberration_enhance_duo_deal_CF.csv' #fn = get_dss( )+ 'fut/engine/aberration_enhance/signal_aberration_enhance_kong_deal_CF.csv' df2 = pd.read_csv(fn) dt_list = df2['datetime'].tolist() dt_list = [dt[:10] for dt in dt_list] # print(dt_list) df2['datetime'] = dt_list line = gen_line(df1, vtSymbol, price_min, price_max) line_atr = gen_atr(df1, 10) line_boll = gen_boll(df1, 10, 2) line = line.overlap(line_boll) scatter_open = gen_poit_open(df2) scatter_close = gen_poit_close(df2) line = line.overlap(scatter_open) line = line.overlap(scatter_close) grid_chart = Grid(init_opts=opts.InitOpts( width="1300px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( line, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="60%"), ) grid_chart.add( line_atr, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="76%", height="17%"), ) fn = get_dss() + 'backtest/render/k_deal_aberration_' + vtSymbol + '.html' grid_chart.render(fn)
def draw_charts(): # #fn = get_dss() +'backtest/fut/m/' + 'm_01_05.csv' # fn = get_dss() +'backtest/fut/m/' + 'day_m.csv' # df1 = pd.read_csv(fn) # df1['datetime'] = df1['date'] + ' ' + df1['time'] # #print(df1.head()) # kline1 = gen_kline_one(df1) # # fn = get_dss() +'backtest/fut/y/' + 'day_y.csv' # df2 = pd.read_csv(fn) # df2['datetime'] = df2['date'] + ' ' + df2['time'] # #print(df1.head()) # kline2 = gen_kline_two(df2) #-------------------------------------------------------------------------- fn = 'bar_kamaresid_raw_duo_CF.csv' fn = 'bar_kamaresid_raw_duo_m.csv' df = pd.read_csv(fn) df.columns = ['date','time','close','q1','q2','resid'] df1 = df.loc[:,['date','time','close']] df2 = df.loc[:,['date','time','resid']] df2['close'] = df2['resid'] print(df1.head(3)) print(df2.head(3)) s1 = 'close' s2 = 'resid' line1 = gen_line_one(df1) line2 = gen_line_two(df2) grid_chart = Grid( init_opts=opts.InitOpts( width="1300px", height="700px", #animation_opts=opts.AnimationOpts(animation=False), ) ) grid_chart.add( line1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="3%", height="39%"), ) grid_chart.add( line2, grid_opts=opts.GridOpts( pos_left="5%", pos_right="3%", pos_top="53%", height="39%" ), ) fn = get_dss( )+ 'backtest/render/k_k_' + s1 + '_' + s2 + '.html' grid_chart.render(fn)
def draw_charts(): vtSymbol = 'CF005' fn = get_dss() + 'fut/bar/min5_' + vtSymbol + '.csv' df1 = pd.read_csv(fn) df1 = df1[df1.date >= '2019-11-20'] df1['datetime'] = df1['date'] + ' ' + df1['time'] # print(df1.head()) fn = get_dss() + 'fut/engine/rsiboll/signal_rsiboll_duo_deal_CF.csv' df2 = pd.read_csv(fn) kline = gen_kline(df1) line_rsi = gen_rsi(df1) line_atr = gen_atr(df1) scatter_deal_one = gen_poit_one(df2) scatter_deal_two = gen_poit_two(df2) scatter_deal_three = gen_poit_three(df2) kline_scatter = kline.overlap(scatter_deal_one) kline_scatter = kline_scatter.overlap(scatter_deal_two) kline_scatter = kline_scatter.overlap(scatter_deal_three) grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline_scatter, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="45%"), ) grid_chart.add( line_rsi, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="57%", height="17%"), ) grid_chart.add( line_atr, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="76%", height="17%"), ) grid_chart.render("k_deal_rsi_atr.html")
def draw_charts(): vtSymbol = 'm' fn = get_dss() + 'backtest/fut/m/day_' + vtSymbol + '.csv' df1 = pd.read_csv(fn) #df1 = df1[df1.date >= '2019-10-12'] df1['datetime'] = df1['date'] + ' ' + df1['time'] # print(df1.head()) kline = gen_kline(df1) line_rsi = gen_rsi(df1) line_atr = gen_atr(df1) grid_chart = Grid(init_opts=opts.InitOpts( width="1500px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="3%", pos_right="8%", height="45%"), ) grid_chart.add( line_rsi, grid_opts=opts.GridOpts(pos_left="3%", pos_right="8%", pos_top="57%", height="17%"), ) grid_chart.add( line_atr, grid_opts=opts.GridOpts(pos_left="3%", pos_right="8%", pos_top="76%", height="17%"), ) fn = get_dss() + 'backtest/render/bar_ti_ti.html' grid_chart.render(fn)
def gen_grid_chart( overlap_kline_line: Kline, width: str, height: str, bar_plot_list: typing.List[Bar], filename: str, ) -> Grid: index = 0 grid_chart = Grid(init_opts=opts.InitOpts( width=width, height=height, animation_opts=opts.AnimationOpts(animation=False), )) pos_top_list, height_list = gen_pos_top_height(plot_list=bar_plot_list) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top=f"{pos_top_list[index]}%", height=f"{height_list[index]}%", ), ) index += 1 bar_plot_list = filter_bar_plot(bar_plot_list) for bar_plot in bar_plot_list: grid_chart.add( bar_plot, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top=f"{pos_top_list[index]}%", height=f"{height_list[index]}%", ), ) index += 1 grid_chart.render(filename) return grid_chart
def generate_kchart(self,MA=[5,10,21],renderfile=False) -> Grid: if self.exists == False: return None # reassign cursor tick to trigger populate attributes like self.histBar and etc. self.cursorTick = self._cursorTick df_toPlot = self.allBars.loc[self.allBars['unit_intdate'] <= self.cursorTick['unit_intdate']] # 输入时间序列中带有未来日期,则取当下能取到的最新online数据模拟 # if len(self.allBars.loc[self.allBars['unit_intdate'] == self.cursorTick['unit_intdate']]) == 0: # df_liveQuote = self.get_livebar(assign_timestamp=self.cursorTick['timeAxis']) # if len(df_liveQuote) > 0: # df_toPlot = df_toPlot.append(df_liveQuote, ignore_index = True, sort=False) str_secname = self.sec_name str_plotname = '{} - {}'.format(self.ts_code,str_secname) '''-----------------画图部分---------------------''' lst_ohlcv=df_toPlot.loc[:,['open','close','low','high']].values.tolist() lst_vol=list(df_toPlot['vol'].values) lst_amount=list(df_toPlot['amount'].values) # 需从处理过的histbar中获得,由于长度比allbar短1,需将值list添加一个空值补齐 lst_peaks=list(abs(self.histBars['peaks'].values)) # lst_pivotdown=[*(float('nan') if i<0 else i for i in list(self.histBars['pivots'].values)),float('nan')] lst_pivotdown=[*(float('nan') if i<0 else i for i in list(self.histBars['valid_pivots'].values)),float('nan')] # lst_pivotup=[*(float('nan') if i>0 else abs(i) for i in list(self.histBars['pivots'].values)),float('nan')] lst_pivotup=[*(float('nan') if i>0 else abs(i) for i in list(self.histBars['valid_pivots'].values)),float('nan')] lst_xaxis=list(df_toPlot['unit_intdate'].astype(str)) # xaxis values has to be STRING type, int will not work def calculate_ma(day_count: int, d): result: List[Union[float, str]] = [] for i in range(len(d)): if i < day_count: result.append("-") continue sum_total = 0.0 for j in range(day_count): sum_total += float(d[i - j][1]) result.append(abs(float("%.3f" % (sum_total / day_count)))) return result kline = (Kline() .add_xaxis(lst_xaxis) .add_yaxis(series_name=str_secname, y_axis=lst_ohlcv, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(type_="min",value_dim="close"), opts.MarkPointItem(type_="max",value_dim="close")], symbol_size = [20, 20], #表示标记宽为 20,高为 10 ), itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0="#00da3c", border_color="#ec0000", border_color0="#00da3c", ),) .set_global_opts( title_opts=opts.TitleOpts( title=str_plotname, subtitle='MA='+str(MA), ), xaxis_opts=opts.AxisOpts(type_="category"), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) ), ), legend_opts=opts.LegendOpts(is_show=True, pos_top='10%', pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0,1,2], range_start=75, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0,1,2], type_="slider", pos_top="90%", range_start=75, range_end=100, ), ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000",font_size=10), ), # 阴量绿阳量红 visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=list(map(lambda x: x+len(MA),[4,5])), #动态算出vol和amt柱状图的series index is_piecewise=True, pieces=[ {"value": 1, "color": "#ec0000"}, {"value": -1, "color": "#00da3c"}, ], ), axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), ) ) trendline = ( Line() .add_xaxis(lst_xaxis) .add_yaxis('高低点', lst_peaks, itemstyle_opts=opts.ItemStyleOpts(color="green")) ) for i in MA: if i is not None: trendline.add_yaxis( series_name='MA'+str(i), y_axis=calculate_ma(day_count=i, d=lst_ohlcv), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) trendline.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) trendline.set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) keyPoints = ( EffectScatter() .add_xaxis(lst_xaxis) .add_yaxis("末跌高", lst_pivotdown,symbol=SymbolType.ARROW,symbol_rotate=180,symbol_size=5,itemstyle_opts=opts.ItemStyleOpts(color="purple")) .add_yaxis("末升低", lst_pivotup,symbol=SymbolType.ARROW,symbol_size=5,itemstyle_opts=opts.ItemStyleOpts(color="blue")) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) ) vol_bar = ( Bar() .add_xaxis(lst_xaxis) .add_yaxis( series_name="交易量", y_axis=[ [i, lst_vol[i], 1 if lst_ohlcv[i][0] < lst_ohlcv[i][1] else -1] for i in range(len(lst_vol)) ], xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="最低", max_="最高", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), ) # .add_yaxis("交易量", lst_vol,itemstyle_opts=opts.ItemStyleOpts(color="#456A76")) ) amnt_bar = ( Bar() .add_xaxis(lst_xaxis) .add_yaxis( series_name="交易额", y_axis=[ [i, lst_amount[i], 1 if lst_ohlcv[i][0] < lst_ohlcv[i][1] else -1] for i in range(len(lst_amount)) ], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=2, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="最低", max_="最高", ), yaxis_opts=opts.AxisOpts( grid_index=2, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), ) # .add_yaxis("交易额", lst_amount,itemstyle_opts=opts.ItemStyleOpts(color="#456A76")) ) priceChart = kline.overlap(trendline).overlap(keyPoints) gridChart = Grid() gridChart.add( priceChart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_bottom='40%'), ) gridChart.add( vol_bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="60%", height='15%'), ) gridChart.add( amnt_bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="75%"), ) fname = '{}{}.html'.format(cfg.PATH_ANAFILE,'kline') gridChart.render(fname) if renderfile else None self.kchart = gridChart # 将结果输出到analytics对象属性中用于function以外的调用 return self
def draw_chart(): kline = ( Kline().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ]), markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts(position="middle", color="blue", font_size=15), data=split_data_part(), symbol=["circle", "none"], ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=split_data_part())). set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts(is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100), opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], # 三个图的 axis 连在一块 # axispointer_opts=opts.AxisPointerOpts( # is_show=True, # link=[{"xAxisIndex": "all"}], # label=opts.LabelOpts(background_color="#777"), # ), )) kline_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="MA5", y_axis=calculate_ma(day_count=5), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), )) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) # Bar-1 bar_1 = ( Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="Volumn", y_axis=data["vols"], xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), # 根据 echarts demo 的原版是这么写的 # itemstyle_opts=opts.ItemStyleOpts( # color=JsCode(""" # function(params) { # var colorList; # if (data.datas[params.dataIndex][1]>data.datas[params.dataIndex][0]) { # colorList = '#ef232a'; # } else { # colorList = '#14b143'; # } # return colorList; # } # """) # ) # 改进后在 grid 中 add_js_funcs 后变成如下 itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) # Bar-2 (Overlap Bar + Line) bar_2 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="MACD", y_axis=data["macds"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=False), )) line_2 = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="DIF", y_axis=data["difs"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DIF", y_axis=data["deas"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) # 最下面的柱状图和折线图 overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid(init_opts=opts.InitOpts(width="1400px", height="800px")) # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format(data["datas"])) # K线图和 MA5 的折线图 grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) # Volumn 柱状图 grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) # MACD DIFS DEAS grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"), ) grid_chart.render("Professional_kline_chart.html")
areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), datazoom_opts=[opts.DataZoomOpts(type_="inside")], title_opts=opts.TitleOpts(title="股票价格增长对比", pos_left='10%', pos_top="40%"), # 把所有的x轴连接在一起 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), )) grid_chart = Grid(init_opts=opts.InitOpts( width="1400px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( line, grid_opts=opts.GridOpts(pos_left="25%", pos_right="15%", pos_top="10%"), ) grid_chart.render('16个股票和医药生物指数增长对比.html') wb.open('16个股票和医药生物指数增长对比.html') print(data['300832.SZ'].tolist())
def show_xd_kline(kline_raw, show=True): freq = '5min' start_dt = kline_raw.iloc[0]["dt"] end_dt = kline_raw.iloc[-1]["dt"] x_data = kline_raw.dt.values.tolist() oclh = kline_raw[['open', 'close', 'low', 'high']].values.tolist() symbol = kline_raw.iloc[0]['symbol'] kline = ( Kline(init_opts=opts.InitOpts(theme=ThemeType.WHITE)) .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name=symbol, y_axis=oclh, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ) .set_global_opts( title_opts=opts.TitleOpts( title="缠论分析结果:%s-%s" % (symbol, freq), subtitle="时间区间:%s 至 %s" % (start_dt, end_dt) ), xaxis_opts=opts.AxisOpts(type_="category"), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) ), ), legend_opts=opts.LegendOpts( is_show=True, pos_top=10, pos_left="center" ), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 1], range_start=0, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], type_="slider", pos_top="90%", range_start=0, range_end=100, ), ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=5, is_piecewise=True, pieces=[ {"value": 1, "color": "#ec0000"}, {"value": -1, "color": "#00da3c"}, ], ), axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), ) ) chan_fx = ( Scatter(init_opts=opts.InitOpts(theme=ThemeType.WHITE)) .add_xaxis(xaxis_data=x_data) .add_yaxis("分型标记", kline_raw.fx.values.tolist(), label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20), ) ) chan_bi = ( Scatter(init_opts=opts.InitOpts(theme=ThemeType.WHITE)) .add_xaxis(xaxis_data=x_data) .add_yaxis("笔标记", kline_raw.bi.values.tolist(), label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20), ) ) chan_xd = ( Scatter(init_opts=opts.InitOpts(theme=ThemeType.WHITE)) .add_xaxis(xaxis_data=x_data) .add_yaxis("线段标记", kline_raw.xd.values.tolist(), label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20), ) ) bar = ( Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name="Volume", yaxis_data=kline_raw.vol.values.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), ) ) # Kline And Line kline = kline.overlap(chan_fx) kline = kline.overlap(chan_bi) kline = kline.overlap(chan_xd) # Grid Overlap + Bar grid_chart = Grid(opts.InitOpts(width="1400px", height="800px", theme=ThemeType.WHITE)) grid_chart.add( kline, grid_opts=opts.GridOpts( pos_left="8%", pos_right="8%", height="60%" ), ) grid_chart.add( bar, grid_opts=opts.GridOpts( pos_left="8%", pos_right="8%", pos_top="70%", height="16%" ), ) graph_path = os.path.join(cache_path, "%s_kline_%s.html" % (symbol, "fx")) grid_chart.render(path=graph_path) # 调用浏览器打开可视化结果 if show: webbrowser.open(graph_path)
def plot_kline(ka, bs=None, file_html="kline.html", width="1400px", height="680px"): """ :param ka: KlineAnalyze :param bs: pd.DataFrame 买卖点,包含三个字段 ["操作提示", "交易时间", "交易价格"] :param file_html: str :param width: str :param height: str :return: None """ df = ka.to_df(use_macd=True, ma_params=(5, 20,)) x = df.dt.to_list() title = "%s | %s 至 %s" % (ka.symbol, ka.start_dt, ka.end_dt) kline = ( Kline() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="", y_axis=df[['open', 'close', 'low', 'high']].values.tolist(), itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True) ) .set_global_opts( title_opts=opts.TitleOpts(title=title, pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(is_show=True, position="inside") ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100 ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], pos_top="96%", range_end=100 ), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], # 三个图的 axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), ) ) kline_line = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="笔", y_axis=df.bi.tolist(), is_smooth=False, is_connect_nones=True, symbol='diamond', symbol_size=8, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='dotted', width=2), label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="线段", y_axis=df.xd.tolist(), is_smooth=False, is_connect_nones=True, symbol='triangle', symbol_size=12, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='solid', width=2), label_opts=opts.LabelOpts(is_show=True, position='right'), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), ) ) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) if isinstance(bs, pd.DataFrame) and len(bs) > 0: c = ( Scatter() .add_xaxis(bs['交易时间'].to_list()) .add_yaxis( "买卖点", bs['交易价格'].to_list(), label_opts=opts.LabelOpts( is_show=True, position="left", formatter=JsCode( "function(params){return bsName[params.dataIndex][0];}" ) ), )) overlap_kline_line = overlap_kline_line.overlap(c) # draw volume bar_1 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="Volumn", yaxis_data=df.vol.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(is_show=True, position='inside') ), legend_opts=opts.LegendOpts(is_show=False), ) ) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="MACD", yaxis_data=df.macd.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), legend_opts=opts.LegendOpts(is_show=False), ) ) line_2 = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="DIF", y_axis=df['diff'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="DEA", y_axis=df['dea'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) ) # draw MACD overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid(init_opts=opts.InitOpts(width=width, height=height, page_title=title)) grid_chart.add_js_funcs("var barData = {}".format(df[['open', 'close', 'low', 'high']].values.tolist())) if isinstance(bs, pd.DataFrame) and len(bs) > 0: grid_chart.add_js_funcs("var bsName = {}".format(bs[["操作提示", "交易价格"]].values.tolist())) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"), ) grid_chart.render(path=file_html)
xaxis_opts=opts.AxisOpts(name='商品'), yaxis_opts=opts.AxisOpts(name='单位:件'))) bar.render('柱状图.html') # html转图片 from pyecharts.charts import Bar, Grid, Pie from pyecharts.render import make_snapshot from snapshot_selenium import snapshot init_opts = opts.InitOpts(width="600px", height="360px") path_html = '柱状图.html' path_png = "E:/GZ/Django/Django_API-1/Django_baogao/DjangoWord/Python_docx/柱状图.png" grid = Grid(init_opts=init_opts) grid.add(bar, grid_opts=opts.GridOpts(pos_top='5')) # 仅使用pos_top修改相对顶部的位置 grid.render(path_html) make_snapshot(snapshot, grid.render(path_html), path_png, delay=2, pixel_ratio=2) #直接生成图片 from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.render import make_snapshot from snapshot_selenium import snapshot
def draw_grow_chart(data): for i in ts_codes: data[i] = data[i].values # print(data[i]) data[i] = data[i] / (data[i][data[i].notnull()].iloc[0]) #除以每一列的第一个非空值 print(data) x = data.index.values.tolist() line = ( Line().add_xaxis(x).add_yaxis( '医药生物指数', data['000808.SH'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '天宇股份', data['300702.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '凯普生物', data['300639.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '普利制药', data['300630.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '贝达药业', data['300558.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '健帆生物', data['300529.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '富祥药业', data['300497.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '万孚生物', data['300482.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '泰格医药', data['300347.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '智飞生物', data['300122.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '安科生物', data['300009.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '凯莱英', data['002821.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '长春高新', data['000661.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '硕世生物', data['688399.SH'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '健友股份', data['603707.SH'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '安图生物', data['603658.SH'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( '新产业', data['300832.SZ'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).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="股票价格增长对比", pos_left='10%', pos_top="40%"), # 把所有的x轴连接在一起 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), )) grid_chart = Grid(init_opts=opts.InitOpts( width="1400px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( line, grid_opts=opts.GridOpts(pos_left="25%", pos_right="15%", pos_top="10%"), ) grid_chart.render('股票增长对比.html')
def draw(df, file_png="test.png"): x = df.dt.to_list() kline = ( Kline() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="", y_axis=df[['open', 'close', 'low', 'high']].values.tolist(), itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True) ) .set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(is_show=True, position="inside") ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100 ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100 ), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], # 三个图的 axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), ) ) kline_line = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="笔", y_axis=df.bi.tolist(), is_smooth=False, is_connect_nones=True, symbol='diamond', symbol_size=8, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='dotted', width=1.5), label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="线段", y_axis=df.xd.tolist(), is_smooth=False, is_connect_nones=True, symbol='triangle', symbol_size=12, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='solid', width=1.5), label_opts=opts.LabelOpts(is_show=True, position='right'), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), ) ) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) df1 = df[df['基准价格'] > 0] c = ( Scatter() .add_xaxis(df1['出现时间'].to_list()) .add_yaxis( "买卖点", df1['基准价格'].to_list(), label_opts=opts.LabelOpts( is_show=True, position="left", formatter=JsCode( "function(params){return bsName[params.dataIndex][0];}" ) ), )) overlap_kline_line = overlap_kline_line.overlap(c) # draw volume bar_1 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="Volumn", yaxis_data=df.vol.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(is_show=True, position='inside') ), legend_opts=opts.LegendOpts(is_show=False), ) ) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="MACD", yaxis_data=df.macd.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), legend_opts=opts.LegendOpts(is_show=False), ) ) line_2 = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="DIF", y_axis=df['diff'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="DEA", y_axis=df['dea'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) ) # draw MACD overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid(init_opts=opts.InitOpts(width="1400px", height="680px")) grid_chart.add_js_funcs("var barData = {}".format(df[['open', 'close', 'low', 'high']].values.tolist())) grid_chart.add_js_funcs("var bsName = {}".format(df1[["操作提示", "基准价格"]].values.tolist())) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"), ) file_html = file_png.replace(".png", '.html') make_snapshot(snapshot, grid_chart.render(path=file_html), file_png)
data=markareadata, itemstyle_opts=opts.ItemStyleOpts(opacity=0.5, ))) kline.set_global_opts( xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True), ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts(type_="inside", range_start=-100), opts.DataZoomOpts(pos_bottom="0%"), ], # title_opts=opts.TitleOpts(title=stock_code), ) grid_chart = Grid(init_opts=opts.InitOpts( width="100%", height="950px", theme=ThemeType.ESSOS, page_title=stock_code, )) grid_chart.add_js_funcs("var areaData={}".format(markareadata)) grid_chart.add_js_funcs("console.log('hello world')") grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="85%"), ) grid_chart.render('pyecharts.html')
def generate_mchart(self,lst_tscode=[],lst_macro=['shibor.1w','pimon.nt_yoy','pimon.ppi_yoy','pimon.m1_yoy','pimon.m2_yoy','pimon.allstock_circ_mv_sum'], lst_findmedian=['pe',()],renderfile=False) -> Grid: if self.exists == False: return None ''' testing findmedian with a given index ''' # df=self._dataagent.query('index_weight',index_code='000300.SH',start_date='20200630', end_date='20200630') # lst_findmedian=['pb',tuple(df['con_code'].values)] ''' ----------test end--------------------''' lst_tscode=list(set([self.ts_code,*lst_tscode])) # lst_findmedian[1] = tuple(self._dataagent.registry.loc[self._dataagent.registry['sec_type']=='stk']['ts_code']) if lst_findmedian[1] is None or len(lst_findmedian[1])==0 else lst_findmedian[1] dat_cursor = self.cursorTick['timeAxis'] int_latestViewDate = self._dataagent.int_findClosestTradeDate(datetime.strftime(dat_cursor,'%Y%m%d') ) df_baseCal = self._dataagent.df_calTbl.loc[self._dataagent.df_calTbl['cal_date']<=int_latestViewDate]['cal_date'].copy() lst_xaxis = ['{}/{}/{}'.format(i[:4],i[4:6],i[6:]) for i in df_baseCal.values.astype('str')] # xaxis values has to be STRING type, int will not work linechart = ( Line() .add_xaxis(lst_xaxis) ) # 生成主线,即目标证券/指数,及比较用的指数 for str_tscode in lst_tscode: # str_tscode = DataAgent.formatCode(code) df_target = self._dataagent.query('load_alldaily',tpl_dateindex=tuple(df_baseCal),ts_code=str_tscode) if len(df_target)>0: df_toPlot = pd.merge(left=df_baseCal, right=df_target, how='left', left_on='cal_date', right_on='trade_date') else: continue '''=====主图画图部分包括主标的和副标的价格曲线,在主图中续把主图及后面叠加图的option,y轴等设置好===''' linename = '{} - {}'.format(str_tscode,self.sec_name) lst_values = list(df_toPlot['close']) lst_values = list(libs.normByRange(lst_values)) linechart.add_yaxis(linename, lst_values, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.3), label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color="#00da3c", ), ) linechart.extend_axis( # 所有保持原比例的折线都放在linechart2里,使用右侧y轴 yaxis=opts.AxisOpts( name="倍数", type_="value", position="right", axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(color="black") ), axislabel_opts=opts.LabelOpts(formatter="{value}倍"), ) ) linechart.set_global_opts( title_opts=opts.TitleOpts( title='宏观比较', ), xaxis_opts=opts.AxisOpts(type_="category"), yaxis_opts=opts.AxisOpts(name="等比例", is_scale=True, ), legend_opts=opts.LegendOpts(is_show=True, pos_top='5%', pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0], range_start=75, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0], type_="slider", pos_top="90%", range_start=75, range_end=100, ), ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000",font_size=10), ), axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), ) '''=============================主图画图部分结束=================''' '''=========叠加图1 尝试读取pe等股票才有的属性,如失败则说明不是股票,循环继续=============''' try: lst_pe = df_toPlot['pe'].values.tolist() lst_pb = df_toPlot['pb'].values.tolist() lst_pepb = [round(lst_pe[index]/value,2) for index, value in enumerate(lst_pb) if value!=0] linechart.add_yaxis(str_tscode+"_PE", lst_pe, yaxis_index=1, #倍数使用右y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) linechart.add_yaxis(str_tscode+"_PE/PB", lst_pepb, yaxis_index=1, #倍数使用右y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) except: continue '''==========================叠加图1结束================================''' df_shibor = self._dataagent.query('load_shibor') # print('Supported shibor columns: {}'.format(df_shibor.columns)) df_aggDay = self._dataagent.query('load_aggDayKPI') # print('Supported macro eco columns: {}'.format(df_aggDay.columns)) df_pimon = self._dataagent.query('load_piMon') df_pimon = pd.merge(df_pimon, df_aggDay, how='left', left_on='date', right_on='trade_date') #与aggday按每月末日期合并以获得如“流通市值”等kpi # print('Supported macro eco columns: {}'.format(df_pimon.columns)) '''=================叠加图2 所有股票的倍数类KPI,使用倍数类y轴=============''' lst_aggDayKPIloop = ['allstock_pe_median','allstock_pe_ttm_median','allstock_pb_median','allstock_pepb_median'] for kpi in lst_aggDayKPIloop: lst_values = df_aggDay[kpi].values.tolist() linechart.add_yaxis(kpi, lst_values, yaxis_index=1, #倍数使用右y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) '''==========================叠加图2结束================================''' '''===========叠加图3 宏观数据如shibor,cpi,m1等,按“。”分割类别进行图表生成,使用等比类y轴 ========''' for item in lst_macro: try: topic,colname = item.split('.') except: print('WARNING! input code {} not recognized...'.format(item)) if topic=='shibor': df_target = df_shibor maxarr = df_target.max(axis=0, skipna=True).values[1:] minarr = df_target.min(axis=0, skipna=True).values[1:] deltaRng = max(maxarr)-min(minarr) # overwrite the normalization function delta to put all shibor rates comparable elif topic=='pimon': df_target = df_pimon deltaRng = None else: print('WARNING! subject code {} is not recognized...'.format(topic)) if len(df_target)>0: df_toPlot = pd.merge(df_baseCal, df_target, how='left', left_on='cal_date', right_on='date') df_toPlot[colname] = df_toPlot[colname].bfill() else: continue linename = item lst_values = list(df_toPlot[colname]) lst_values = list(libs.normByRange(lst_values,delta=deltaRng)) linechart.add_yaxis(linename, lst_values, # 所有等比例缩放的折线都放在linechart里,使用左侧y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1,opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) '''==========================叠加图3结束================================''' '''========叠加图4 如参数给出需要寻找中位数的股票列表则读取相应所有本地文件后计算并生成叠加图标========''' if lst_findmedian[1] is not None and len(lst_findmedian[1])>0 : str_cat = lst_findmedian[0] df_result = pd.DataFrame() for str_tscode in lst_findmedian[1]: try: df = self._dataagent.query('load_alldaily',tpl_dateindex=tuple(df_baseCal),ts_code=str_tscode)[['ts_code','trade_date',str_cat]] print('{} csv file loaded for {} trend analysis...'.format(str_tscode,str_cat),end='\r') except Exception as e: print('WARNING! {} csv file not found...'.format(str_tscode)) continue df_result = pd.concat([df_result,df]) df_result.dropna(subset=[str_cat],inplace=True) df_result = df_result.loc[df_result['trade_date']>19940301] # libs.df_csv(cfg.PATH_BUGFILE,(df_result.groupby('trade_date')['ts_code'].count(),)) # print(df_result.groupby('trade_date')['ts_code'].count()) df_target = df_result.groupby('trade_date')[str_cat].median() if len(df_target)>0: df_toPlot = pd.merge(left=df_baseCal, right=df_target, how='left', left_on='cal_date', right_on='trade_date') linename = '{}-median'.format(str_cat) lst_values = list(df_toPlot[str_cat]) lst_values = list(lst_values) linechart.add_yaxis(linename, lst_values, yaxis_index=1, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) else: pass '''==========================叠加图4结束================================''' # put everything in a grid for easy resizing and positioning gridChart = Grid() gridChart.add( linechart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top='25%'), ) fname = '{}{}.html'.format(cfg.PATH_ANAFILE,'macro') gridChart.render(fname) if renderfile else None self.mchart = gridChart #输出至可访问对象属性中 return self
"lq", [0.3254], center=["25%", "50%"], label_opts=opts.LabelOpts( font_size=50, formatter=JsCode("""function (param){ return (Math.floor(param.value * 10000)/100) + '%'; }"""), position="inside", ), ) grid = Grid().add(l1, grid_opts=opts.GridOpts()).add(l2, grid_opts=opts.GridOpts()) grid.render("multiple_liquid.html") # Section2 平行坐标系 from pyecharts.charts import Parallel data = [ [1, 91, 45, 125, 0.82, 34, 23, "良"], [2, 65, 27, 78, 0.86, 45, 29, "良"], [3, 83, 60, 84, 1.09, 73, 27, "良"], [4, 109, 81, 121, 1.28, 68, 51, "轻度污染"], [5, 106, 77, 114, 1.07, 55, 51, "轻度污染"], [6, 109, 81, 121, 1.28, 68, 51, "轻度污染"], [7, 106, 77, 114, 1.07, 55, 51, "轻度污染"], [8, 89, 65, 78, 0.86, 51, 26, "良"], [9, 53, 33, 47, 0.64, 50, 17, "良"], [10, 80, 55, 80, 1.01, 75, 24, "良"],
def createView(self, Clt, city_name): # Clt客户端程序 # self.day_datas, self.time_datas = SearchSQL().airDatas(city_name) air_datas = Clt.sendData(f"3 {city_name}") self.day_datas = air_datas["day"] self.time_datas = air_datas["time"] timepoint = [[], []] aqi = [[], []] so2 = [[], []] no2 = [[], []] co = [[], []] o3 = [[], []] pm2_5 = [[], []] pm10 = [[], []] for datas in self.day_datas: # 分割日期 day = re.sub("^2.*?-", '', datas[2].split(' ')[0]) # 取出日期,将年份去掉 timepoint[0].append(day) aqi[0].append(int(datas[4])) so2[0].append(int(datas[5])) no2[0].append(int(datas[6])) co[0].append(float(datas[7])) o3[0].append(int(datas[8])) pm2_5[0].append(int(datas[9])) pm10[0].append(int(datas[10])) # print(timepoint[0], aqi[0], so2[0], no2[0], co[0], o3[0], pm2_5[0], pm10[0]) day_line = Line() day_line.add_xaxis(timepoint[0]) # 增加x轴 day_line.add_yaxis( "AQI", aqi[0], is_smooth=True, # 线条平滑 areastyle_opts=opts.AreaStyleOpts(opacity=0), # 曲线填充面积的透明度 color="#4169E1") day_line.add_yaxis("SO2", so2[0], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") day_line.add_yaxis("NO2", no2[0], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#4169E1") day_line.add_yaxis("CO", co[0], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") day_line.add_yaxis("O3", o3[0], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") day_line.add_yaxis("PM2.5", pm2_5[0], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#4169E1") day_line.add_yaxis("PM10", pm10[0], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") day_line.set_global_opts( title_opts=opts.TitleOpts(title=city_name, subtitle="日报", padding=1, pos_left="center", item_gap=7), # 设置标题居中 legend_opts=opts.LegendOpts( pos_right="right", # 将标签设置为水平居右 pos_top="center", # 将标签设置为垂直居中 padding=1, # 标签与边界距离 item_gap=16, # 标签之间的间距 item_height=12, # 标签的高度 ), xaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_align_with_label=True), is_scale=False, boundary_gap=False), # 图像贴近y轴 yaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts(is_show=True)) # 增加y轴分割线 ) day_line.set_series_opts( markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem( type_="max", itemstyle_opts=opts.ItemStyleOpts("#e61b14")), opts.MarkPointItem( type_="min", itemstyle_opts=opts.ItemStyleOpts("#14e66f")), ], # 标注最大值最小值 symbol_size=[30, 34], # 标注样式的宽,高 label_opts=opts.LabelOpts( position="inside", color="#fff", # 标注内的字体颜色 font_size=9)), # 标注内字体的大小 label_opts=opts.LabelOpts(is_show=True) # 显示每个坐标点的值 # markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]) # 标注平均线 ) # 系列配置项 # 设置图表在页面居中:Anaconda3\Lib\site - packages\pyecharts\render\templates\macro # 添加margin:auto;top:8px; # 框架 day_grid = Grid(init_opts=opts.InitOpts(width="800px", height="380px")) day_grid.add(day_line, grid_opts=opts.GridOpts(pos_top="70")) day_grid.render("./web/day_line.html") for datas in self.time_datas: temp_time = datas[2].split(' ')[1] # 取出时间 time = re.sub(":00$", '', temp_time) # 删除秒 timepoint[1].append(time) aqi[1].append(int(datas[3])) so2[1].append(int(datas[4])) no2[1].append(int(datas[5])) co[1].append(float(datas[6])) o3[1].append(int(datas[7])) pm2_5[1].append(int(datas[8])) pm10[1].append(int(datas[9])) # print(timepoint[1], aqi[1], so2[1], no2[1], co[1], o3[1], pm2_5[1], pm10[1]) time_line = Line( init_opts=opts.InitOpts(width="800px", height="300px")) time_line.add_xaxis(timepoint[1]) # 增加x轴 time_line.add_yaxis( "AQI", aqi[1], is_smooth=True, # 线条平滑 areastyle_opts=opts.AreaStyleOpts(opacity=0), # 曲线填充面积的透明度 color="#4169E1") time_line.add_yaxis("SO2", so2[1], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") time_line.add_yaxis("NO2", no2[1], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#4169E1") time_line.add_yaxis("CO", co[1], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") time_line.add_yaxis("O3", o3[1], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") time_line.add_yaxis("PM2.5", pm2_5[1], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#4169E1") time_line.add_yaxis("PM10", pm10[1], is_smooth=True, areastyle_opts=opts.AreaStyleOpts(opacity=0), color="#FF0033") time_line.set_global_opts( title_opts=opts.TitleOpts(title=city_name, subtitle="时报", padding=1, pos_left="center", item_gap=7), legend_opts=opts.LegendOpts( pos_right="right", # 将标签设置为水平居右 pos_top="center", # 将标签设置为垂直居中 padding=1, # 标签与边界距离 item_gap=16, # 标签之间的间距 item_height=12, # 标签的高度 ), xaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_align_with_label=True), is_scale=False, boundary_gap=False), # 图像贴近y轴 yaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts(is_show=True)) # 增加y轴分割线 ) time_line.set_series_opts( markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem( type_="max", itemstyle_opts=opts.ItemStyleOpts("#e61b14")), opts.MarkPointItem( type_="min", itemstyle_opts=opts.ItemStyleOpts("#87CEFA")) ], # 标注最大值最小值 symbol_size=[30, 34], # 标注样式的宽,高 label_opts=opts.LabelOpts(position="inside", color="#fff", font_size=9)), # 标注内字体的大小 label_opts=opts.LabelOpts(is_show=True) # 显示每个坐标点的值 # markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]) # 标注平均线 ) # 系列配置项 time_grid = Grid( init_opts=opts.InitOpts(width="800px", height="380px")) time_grid.add(time_line, grid_opts=opts.GridOpts(pos_top="70")) time_grid.render("./web/time_line.html")
def draw_kine(stock_data): ''' pyecharts V1 版本开始支持链式调用 文档地址 https://pyecharts.org/#/zh-cn/ ''' stock_data.index = pd.to_datetime(stock_data['TIME'], format="%Y/%m/%d") stock_data = stock_data[["TIME", "OPEN", "CLOSE", "LOW", "HIGH", "VOLUME"]] # stock_data = stock_data.sort_index(ascending=True) # 倒序,看时间顺序是否正常 # k线图 kline = ( Kline().add_xaxis(stock_data[["TIME"]].values.tolist()).add_yaxis( "K线图", stock_data.iloc[:, 1:5].values.tolist(), itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( xaxis_opts=opts.AxisOpts(is_scale=True, is_show=False), # axis_opts=opts.AxisOpts(is_scale=True,min_=0), #y轴起始坐标可以设为0 yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), # y轴起始坐标可自动调整 title_opts=opts.TitleOpts(title="价格", subtitle=ts_code, pos_top="20%"), axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), datazoom_opts=[ # 设置zoom参数后即可缩放 opts.DataZoomOpts( is_show=True, type_="inside", xaxis_index=[0, 1], # 设置第0轴和第1轴同时缩放 range_start=0, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], type_="slider", pos_top="90%", range_start=0, range_end=100, ), ], brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), )) # 成交量柱形图 x = stock_data[["TIME"]].values.tolist() y = stock_data[["VOLUME"]].values[:, 0].tolist() bar = (Bar().add_xaxis(x).add_yaxis( "成交量", y, xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( title_opts=opts.TitleOpts(title="成交量", pos_top="70%"), legend_opts=opts.LegendOpts(is_show=False), )) # 使用网格将多张图标组合到一起显示 grid_chart = Grid(init_opts=opts.InitOpts( width="1200px", height="600px", animation_opts=opts.AnimationOpts(animation=False), )) # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format( stock_data.iloc[:, 1:5].values.tolist())) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="15%", pos_right="15%", height="55%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="15%", pos_right="15%", pos_top="70%", height="20%"), ) grid_chart.render('stock_{}.html'.format(ts_code)) #保存成用股票代码命名的文档
def kline_viewer(ts_code, freq, end_date, asset='E', show=True): """ :param show: :param ts_code: :param freq: :param end_date: :param asset: :return: example: >>> from chan.web.vis_kline import kline_viewer >>> kline_viewer(ts_code='002739.SZ', freq='1min', end_date="20190809", asset='E') """ kline_raw = get_kline(ts_code, freq=freq, end_date=end_date, asset=asset, indicators=('ma', 'macd')) for col in ['open', 'close', 'high', 'low']: kline_raw[col] = kline_raw[col].apply(round, args=(2, )) kline_chan = find_xd(find_bi(find_fx(preprocess(kline_raw)))) kline_chan = kline_chan[[ 'dt', 'fx', 'fx_mark', 'bi', 'bi_mark', 'xd', 'xd_mark' ]] kline_raw = kline_raw.merge(kline_chan, how='left', on='dt') start_dt = kline_raw.iloc[0]["dt"] end_dt = kline_raw.iloc[-1]["dt"] x_data = kline_raw.dt.values.tolist() oclh = kline_raw[['open', 'close', 'low', 'high']].values.tolist() symbol = kline_raw.iloc[0]['symbol'] kline = (Kline(init_opts=opts.InitOpts(theme=ThemeType.WHITE)).add_xaxis( xaxis_data=x_data).add_yaxis( series_name=symbol, y_axis=oclh, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( title_opts=opts.TitleOpts(title="缠论分析结果:%s-%s" % (symbol, freq), subtitle="时间区间:%s 至 %s" % (start_dt, end_dt)), xaxis_opts=opts.AxisOpts(type_="category"), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), legend_opts=opts.LegendOpts(is_show=True, pos_top=5, pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 1], range_start=0, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], type_="slider", pos_top="60%", range_start=0, range_end=100, ), ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=5, is_piecewise=True, pieces=[ { "value": 1, "color": "#ec0000" }, { "value": -1, "color": "#00da3c" }, ], ), axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), )) line = (Line(init_opts=opts.InitOpts(theme=ThemeType.WHITE)).add_xaxis( xaxis_data=x_data).add_yaxis( series_name="MA5", y_axis=kline_raw.ma5.values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA10", y_axis=kline_raw.ma10.values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA20", y_axis=kline_raw.ma20.values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA60", y_axis=kline_raw.ma60.values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA120", y_axis=kline_raw.ma120.values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA250", y_axis=kline_raw.ma250.values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) chan_fx = (Scatter(init_opts=opts.InitOpts( theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis( "分型标记", kline_raw.fx.values.tolist()).set_global_opts( visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20), )) chan_bi = (Scatter(init_opts=opts.InitOpts( theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis( "笔标记", kline_raw.bi.values.tolist()).set_global_opts( visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20), )) chan_xd = (Scatter(init_opts=opts.InitOpts( theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis( "线段标记", kline_raw.xd.values.tolist()).set_global_opts( visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20), )) # Kline And Line kline = kline.overlap(line) kline = kline.overlap(chan_fx) kline = kline.overlap(chan_bi) kline = kline.overlap(chan_xd) # ========================================================== macd_line = (Line(init_opts=opts.InitOpts( theme=ThemeType.WHITE)).add_xaxis(xaxis_data=x_data).add_yaxis( series_name="DEA", y_axis=kline_raw['dea'].values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DIFF", y_axis=kline_raw['diff'].values.tolist(), is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) macd_bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis( xaxis_data=x_data).add_yaxis( series_name="Volume", yaxis_data=kline_raw.macd.values.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) macd = macd_line.overlap(macd_bar) # ========================================================== bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis( xaxis_data=x_data).add_yaxis( series_name="Volume", yaxis_data=kline_raw.vol.values.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) # Grid Overlap + Bar grid_chart = Grid( opts.InitOpts(width="1500px", height="800px", theme=ThemeType.WHITE)) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="8%", pos_right="8%", height="50%"), ) grid_chart.add( macd, grid_opts=opts.GridOpts(pos_left="8%", pos_right="8%", pos_top="60%", height="16%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="8%", pos_right="8%", pos_top="70%", height="16%"), ) # 调用浏览器打开可视化结果 if show: graph_path = os.path.join(cache_path, "%s_kline_%s.html" % (symbol, freq)) grid_chart.render(path=graph_path) webbrowser.open(graph_path) return grid_chart
def draw_chart(): kline = (Kline().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts(color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143"), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ]), markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts(position="middle", color="blue", font_size=15), data=split_data_part(), symbol=["circle", "none"], ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=split_data_part())).set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts(is_show=True, type_="inside", xaxis_index=[0, 0], range_end=100), opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], )) kline_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="MA5", y_axis=calculate_ma(day_count=5), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), )) overlap_kline_line = kline.overlap(kline_line) bar_1 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="Volumn", y_axis=data["vols"], label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params){ var colorList; if(barData[params.dataIndex][1] > barData[params.dataIndex][0]){ colorList = '#ef232a'; }else{ colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) bar_2 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="MACD", y_axis=data["macds"], label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params){ var colorList; if(params.data >= 0){ colorList = '#ef232a'; }else{ colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=False), )) line_2 = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="DIF", y_axis=data["difs"], label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) overlap_bar_line = bar_2.overlap(line_2) grid_chart = Grid(init_opts=opts.InitOpts( width="1400px", height="800px", theme=ThemeType.ESSOS)) grid_chart.add_js_funcs("var barData={}".format(data["datas"])) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) grid_chart.add(overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%")) grid_chart.render("professional_kline_chart.html")
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)) )).set_global_opts( yaxis_opts=opts.AxisOpts( name='Game numbers', min_=0, max_=1500, position='right', offset=135, # axisline_opts=opts.AxisLineOpts( # linestyle_opts=opts.LineStyleOpts(color='#d14a61') # ) ), title_opts=opts.TitleOpts(title='Why?'), tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross'), datazoom_opts=opts.DataZoomOpts(), ).set_series_opts(label_opts=opts.LabelOpts(is_show=False))) bar2 = (Bar().add_xaxis(year_list).add_yaxis( 'Mean Sales', mean_list, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False))) bar.overlap(bar2) grid = Grid() grid.add(bar, opts.GridOpts(pos_left='5%', pos_right='20%'), is_control_axis_index=True) grid.render('Why total sales are growing when mean sales are reducing.html')
def draw_charts(x_axis_list, oclh_data_list, volume_list, tech_line_dict): upColor = '#ec0000' downColor = '#00da3c' upBorderColor = '#8A0000' downBorderColor = '#008F2' kline = (Kline().add_xaxis(x_axis_list).add_yaxis( series_name="kline", y_axis=oclh_data_list, markpoint_opts=opts.MarkPointOpts( data=gen_mark_points_data_list())).set_series_opts( itemstyle_opts=opts.ItemStyleOpts( color=upColor, color0=downColor, border_color=upBorderColor, border_color0=downBorderColor), ).set_global_opts( legend_opts=opts.LegendOpts(pos_bottom=10, pos_left="center"), xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), tooltip_opts=opts.TooltipOpts( trigger='axis', axis_pointer_type='cross', background_color='rgba(245,245,245,0.8)', border_width=1, border_color='#ccc', textstyle_opts=opts.TextStyleOpts(color='#000')), visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=5, is_piecewise=True, pieces=[ { "value": 1, "color": downColor }, { "value": -1, "color": upColor }, ], ), datazoom_opts=[ opts.DataZoomOpts( type_="inside", xaxis_index=[0, 1], range_start=98, range_end=100, ), opts.DataZoomOpts( type_="slider", xaxis_index=[0, 1], range_start=98, range_end=100, pos_top='85%', ) ], axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), title_opts=opts.TitleOpts(title="Kline"))) if tech_line_dict: line = (Line().add_xaxis(xaxis_data=x_axis_list).set_global_opts( xaxis_opts=opts.AxisOpts(type_="category"))) [ line.add_yaxis( series_name=name, y_axis=value_list, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) for name, value_list in tech_line_dict.items() ] kline = kline.overlap(line) bar = (Bar().add_xaxis(x_axis_list).add_yaxis( series_name="成交量", yaxis_data=volume_list, xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False)).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) grid_chart = Grid(init_opts=opts.InitOpts( width="2000px", height="800px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add(kline, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%")) grid_chart.add(bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="63%", height="16%")) folder_path = get_folder_path("backtesting_result_pyecharts") file_path = f"{folder_path}/render.html" grid_chart.render(path=file_path) return file_path
def draw_chart(df, extend_field, save_path="", trade_list=None, point_list=None, area_list=None, kline_title="买卖点K线图", is_smooth=True, is_connect_nones=False): datetime_array = df.datetime.tolist() volume_array = df.volume.tolist() # open close low high kline_data = df[["open", "close", "low", "high"]].values.tolist() # 绘制买卖点 _point_list = [] # 绘制标志点 if point_list is not None and len(point_list) > 1: for point in point_list: if type(point["datetime"]) == str: point_datetime = point["datetime"] else: point_datetime = point["datetime"].strftime( "%Y-%m-%d %H:%M:%S.%f") point_name = point.get("name", "") _point_list.append( opts.MarkPointItem( name=point_name, coord=[point_datetime, point["y"]], value=point_name if point_name else point["y"], itemstyle_opts=opts.ItemStyleOpts( color=point.get("color", "#ef232a")))) else: if trade_list is not None and len(trade_list) > 1: for trade in trade_list: # 开多 if type(trade[0]) == str: trade_datetime = trade[0] else: trade_datetime = trade[0].strftime( "%Y-%m-%d %H:%M:%S.%f") if trade_datetime < datetime_array[0]: continue if trade[1] == "多" and trade[4] == "开": _point_list.append( opts.MarkPointItem( name="开多", coord=[trade_datetime, trade[6]], value="开多", itemstyle_opts=opts.ItemStyleOpts( color="#ef232a"))) # 开空 elif trade[1] == "空" and trade[4] == "开": _point_list.append( opts.MarkPointItem( name="开空", coord=[trade_datetime, trade[6]], value="开空", itemstyle_opts=opts.ItemStyleOpts( color="#ef232a"))) # 平多 elif trade[1] == "多" and (trade[4] == "平" or trade[4] == "平今" or trade[4] == "平昨"): _point_list.append( opts.MarkPointItem( name="平空", coord=[trade_datetime, trade[6]], value="平空", itemstyle_opts=opts.ItemStyleOpts( color="#14b143"))) # 平空 elif trade[1] == "空" and (trade[4] == "平" or trade[4] == "平今" or trade[4] == "平昨"): _point_list.append( opts.MarkPointItem( name="平多", coord=[trade_datetime, trade[6]], value="平多", itemstyle_opts=opts.ItemStyleOpts( color="#14b143"))) # 绘制矩形 _area_list = [] if area_list is not None and len(area_list) > 1: for item in area_list: _area_list.append( opts.MarkAreaItem( x=item["x"], y=item["y"], itemstyle_opts=opts.ItemStyleOpts( color="transparent", border_color=item.get("border_color", "#4D0099"), border_width=3, border_type="dashed"), )) kline = (Kline().add_xaxis(xaxis_data=datetime_array).add_yaxis( series_name="Kline", y_axis=kline_data, itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), markpoint_opts=opts.MarkPointOpts(data=_point_list), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( data=_area_list, )).set_global_opts( title_opts=opts.TitleOpts(title=kline_title, pos_left="2%", pos_top="1%"), legend_opts=opts.LegendOpts(is_show=True, pos_top=10, pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 1], range_start=0, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], type_="slider", pos_top="88%", range_start=0, range_end=100, ), ], yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=5, is_piecewise=True, pieces=[ { "value": 1, "color": "#00da3c" }, { "value": -1, "color": "#ec0000" }, ], ), axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), )) bar = (Bar().add_xaxis(xaxis_data=datetime_array).add_yaxis( series_name="Volume", y_axis=volume_array, xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) if len(extend_field) > 0: line = (Line().add_xaxis( xaxis_data=datetime_array).set_global_opts( xaxis_opts=opts.AxisOpts(type_="category"), legend_opts=opts.LegendOpts(is_show=True), )) for field in extend_field: field_value_array = df[field].tolist() line.add_yaxis( series_name=field, y_axis=field_value_array, is_smooth=is_smooth, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8), label_opts=opts.LabelOpts(is_show=False), is_connect_nones=is_connect_nones, ) # Kline And Line kline = kline.overlap(line) # Grid Overlap + Bar grid_chart = Grid(init_opts=opts.InitOpts( width="100%", height="760px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="3.5%", pos_right="3.5%", height="60%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="3.5%", pos_right="3.5%", pos_top="70%", height="16%"), ) grid_chart.render(os.path.join(save_path, "KLineChart.html"))