def plot_kline(df, rendered=True, col=""): """ 针对 dataframe 直接画出标准看盘软件的上k线图下成交量图的形式 :param df: :param rendered: :param col: :return: """ kline = ( Kline() .add_xaxis(xaxis_data=list(df["date"])) .add_yaxis( series_name="", itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), y_axis=list(zip(df["open"], df["close"], df["high"], df["low"])), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ], symbol="pin", symbol_size=[56, 40], # label_opts=opts.LabelOpts(color="#CCFFFF",position=["top", "bottom"]) ), ) .set_global_opts( datazoom_opts=[ opts.DataZoomOpts( is_show=True, type_="slider", range_start=50, range_end=100, xaxis_index=[0, 1], ), opts.DataZoomOpts( is_show=False, type_="inside", range_start=50, range_end=100, xaxis_index=1, ), ], tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), ) ) if col: line = ( Line() .add_xaxis(xaxis_data=list(df["date"])) .add_yaxis( series_name="", y_axis=list(df[col]), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) ) kline = kline.overlap(line) if "volume" in df.columns: vl = list(df["volume"]) elif "amount" in df.columns: vl = list(df["amount"]) else: vl = [0 for _ in range(len(df))] bar = ( Bar() .add_js_funcs("var barData = {}".format(list(df["close"] - df["open"]))) .add_xaxis(xaxis_data=list(df["date"])) .add_yaxis( series_name="", yaxis_data=vl, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex]>0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), ) ) grid_chart = Grid() grid_chart.add_js_funcs("var barData = {}".format(list(df["close"] - df["open"]))) grid_chart.add( kline, grid_opts=opts.GridOpts( pos_left="10%", pos_right="1%", pos_top="2%", height="65%" ), ) grid_chart.add( bar, grid_opts=opts.GridOpts( pos_left="10%", pos_right="1%", pos_top="71%", height="22%" ), ) if rendered: return grid_chart.render_notebook() else: return grid_chart
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)
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")
def draw_chart(cls, data): 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=cls.split_data_part(data), symbol=["circle", "none"], ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=cls.split_data_part(data))). 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), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 3], 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"]) # # EMA10 # .add_yaxis( # series_name="EMA10", # y_axis=data["ema10"], # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # ) # EMA144 # .add_yaxis( # series_name="EMA144", # y_axis=data["ema144"], # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # ) # boll_median .add_yaxis( series_name="median", y_axis=data["boll_median"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) # boll_upper .add_yaxis( series_name="upper", y_axis=data["boll_upper"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) # boll_lower .add_yaxis( series_name="lower", y_axis=data["boll_lower"], xaxis_index=2, yaxis_index=2, 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", yaxis_data=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", yaxis_data=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="DEA", 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))) rsi_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="rsi6", y_axis=data["rsi6"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="rsi12", y_axis=data["rsi12"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="rsi24", y_axis=data["rsi24"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) # MACD 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="4%", pos_right="1%", height="45%"), ) # Volumn 柱状图 grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="56%", height="10%"), ) # MACD DIFS DEAS grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="68%", height="14%"), ) # rsi6 grid_chart.add( rsi_line, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="84%", height="10%"), ) return grid_chart.render_embed()
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 NPS(CenterName): Items = CenterName SubTitle = "各项目NPS" NPS_Scores = [ 25.01, 26.33, 27.21, 22.22, 21.11, 20.03, 23.00, 24.44, 26.36 ] BigTitle = '碧桂园集中式商业消费者满意度研究' Color_Com = 'rgba(61,109,207,0.6)' Color_Min = 'rgba(55,148,140,1)' Color_Max = 'rgba(212,105,105,1)' bar = Bar(init_opts=opts.InitOpts(bg_color={ "type": "pattern", "image": JsCode("img"), "repeat": "no-repeat" }, )) bar.add_xaxis(xaxis_data=Items) bar.add_yaxis(series_name='NPS', yaxis_data=NPS_Scores, itemstyle_opts=opts.ItemStyleOpts(color=Color_Com), label_opts=opts.LabelOpts(position='inside', formatter="{c}%")) bar.set_global_opts(title_opts=opts.TitleOpts( title=BigTitle, subtitle=SubTitle, pos_right='center', title_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)', font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)', font_size=16)), legend_opts=opts.LegendOpts(is_show=False), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts( formatter="{value}%"))) bar.set_series_opts( markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(name='Average', type_='average')], linestyle_opts=opts.LineStyleOpts(color=Color_Max, width=3, type_='dashed'), label_opts=opts.LabelOpts(formatter="{c}%")), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem( name='Min_Score', type_='min', symbol_size=75, itemstyle_opts=opts.ItemStyleOpts(color=Color_Min)), opts.MarkPointItem( name='Max_Score', type_='max', symbol_size=75, itemstyle_opts=opts.ItemStyleOpts(color=Color_Max)) ], label_opts=opts.LabelOpts( formatter="{c}%", font_size=10, position='inside'))) bar.add_js_funcs( "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';" ) grid = Grid(init_opts=opts.InitOpts(bg_color={ "type": "pattern", "image": JsCode("img"), "repeat": "no-repeat" }, width='1200px', height='650px')) grid.add_js_funcs( "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';" ) grid.add(bar, grid_opts=opts.GridOpts(width=850, pos_top='90')) return grid
def Satisfaction(CenterName, TabName, Scores_List): Items = CenterName SubTitle = TabName + "指标得分" Scores = Scores_List BigTitle = '碧桂园集中式商业消费者满意度研究' Color_Com = 'rgba(61,109,207,0.6)' Color_Min = 'rgba(55,148,140,1)' Color_Max = 'rgba(212,105,105,1)' bar = Bar(init_opts=opts.InitOpts(bg_color={ "type": "pattern", "image": JsCode("img"), "repeat": "no-repeat" }, )) bar.add_xaxis(xaxis_data=Items) for i in range(len(Scores)): if (i == 0): bar.add_yaxis( series_name=Scores[i][0], yaxis_data=Scores[i][1:], itemstyle_opts=opts.ItemStyleOpts(color=Color_Com), label_opts=opts.LabelOpts(position='inside'), ) else: bar.add_yaxis(is_selected=False, series_name=Scores[i][0], yaxis_data=Scores[i][1:], itemstyle_opts=opts.ItemStyleOpts(color=Color_Com), label_opts=opts.LabelOpts(position='inside')) bar.set_global_opts(title_opts=opts.TitleOpts( title=BigTitle, subtitle=SubTitle, pos_right='center', title_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)', font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color='rgba(0,0,0,0.8)', font_size=16)), legend_opts=opts.LegendOpts(orient='vertical', pos_left='85%', pos_top='middle', item_width=10, item_height=11, item_gap=20, selected_mode='single')) bar.set_series_opts( markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(name='Average', type_='average')], linestyle_opts=opts.LineStyleOpts(color=Color_Max, width=3, type_='dashed')), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(name='Min_Score', type_='min', symbol_size=75, itemstyle_opts=opts.ItemStyleOpts( color=Color_Min)), opts.MarkPointItem(name='Max_Score', type_='max', symbol_size=75, itemstyle_opts=opts.ItemStyleOpts( color=Color_Max)) ])) bar.add_js_funcs( "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';" ) grid = Grid(init_opts=opts.InitOpts(bg_color={ "type": "pattern", "image": JsCode("img"), "repeat": "no-repeat" }, width='1200px', height='650px')) grid.add_js_funcs( "var img = new Image(); img.src = 'https://s1.ax1x.com/2020/03/27/GPWPKI.jpg';" ) grid.add(bar, grid_opts=opts.GridOpts(width=850, pos_top='90')) return grid
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 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)
def draw_chart(stock_data): ''' pyecharts V1 版本开始支持链式调用 文档地址 https://pyecharts.org/#/zh-cn/ ''' stock_data.index = pd.to_datetime(stock_data['TIME'], format="%Y/%m/%d") x = stock_data["TIME"].values.tolist() stock_basic_data = stock_data[[ "TIME", "OPEN", "CLOSE", "LOW", "HIGH", "VOLUME" ]] # stock_data = stock_data.sort_index(ascending=True) # 倒序,看时间顺序是否正常决定是不是要用 # k线图 kline = ( Kline().add_xaxis(x).add_yaxis( "K线图", stock_basic_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轴起始坐标可自动调整 tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="5%", pos_top='20%'), title_opts=opts.TitleOpts(title="股票价格", subtitle=ts_code, pos_left='22%', pos_top="20%"), #把所有的x轴连接在一起 # 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, 2, 3, 4], # 设置第0轴和第1轴同时缩放 range_start=0, range_end=100, ), ], )) # 成交量柱形图 bar_volumn = (Bar().add_xaxis(x).add_yaxis( "成交量", stock_basic_data["VOLUME"].values.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( title_opts=opts.TitleOpts(title="成交量", pos_left='22%', pos_top="48%"), legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="5%", pos_top='48%'), )) #绘制均线图 line_ma = ( Line().add_xaxis(x).add_yaxis( series_name="MA5", y_axis=stock_data["MA5"].values.tolist(), is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="MA10", y_axis=stock_data["MA10"].values.tolist(), is_hover_animation=False, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="MA20", y_axis=stock_data["MA20"].values.tolist(), is_hover_animation=False, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts( title_opts=opts.TitleOpts(title="MA", pos_left='22%', pos_top="88%"), xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), is_scale=True), datazoom_opts=[opts.DataZoomOpts(type_="inside")], legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="5%", pos_top='85%'), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), )) #绘制jdk线 line_kdj = (Line().add_xaxis(x).add_yaxis( series_name="K", y_axis=stock_data["K"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="D", y_axis=stock_data["D"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="J", y_axis=stock_data["J"].values.tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts( title_opts=opts.TitleOpts(title="KDJ", pos_left='22%', pos_top="62%"), datazoom_opts=[opts.DataZoomOpts(type_="inside", )], legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="7%", pos_top='60%'), xaxis_opts=opts.AxisOpts( is_scale=True, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), )) #绘制macd柱状图 bar_macd = (Bar().add_xaxis(x).add_yaxis( series_name='MACD', yaxis_data=stock_data['MACD'].values.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( title_opts=opts.TitleOpts(title="MACD", pos_left='22%', pos_top="75%"), 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=True, orient='vertical', pos_right="5%", pos_top='70%'), )) #绘制DIF和DEA line_macd = (Line().add_xaxis(x).add_yaxis( series_name="DIF", y_axis=stock_data['DIF'].values.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="DEA", y_axis=stock_data['DEA'].values.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) #绘制布林线 line_boll = (Line().add_xaxis(x).add_yaxis( series_name="MID", y_axis=stock_data["MID"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="UPPER", y_axis=stock_data["UPPER"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="LOWER", y_axis=stock_data["LOWER"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts( datazoom_opts=[opts.DataZoomOpts(type_="inside", )], 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)), ), )) overlap_kline_linema = kline.overlap(line_boll) overlap_macd = bar_macd.overlap(line_macd) # 使用网格将多张图标组合到一起显示 grid_chart = Grid(init_opts=opts.InitOpts( width="1400px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) # 为了把 data.datas 的数据写入到html中作为全局变量,目前无法跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format( stock_basic_data.iloc[:, 1:5].values.tolist())) grid_chart.add( overlap_kline_linema, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="3%", height="40%"), ) grid_chart.add( bar_volumn, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="45%", height="10%"), ) grid_chart.add(line_kdj, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="60%", height="10%")) grid_chart.add(overlap_macd, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="72%", height="10%")) grid_chart.add(line_ma, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="85%", height="10%")) grid_chart.render('stock_{}/stock_{}.html'.format( ts_code, ts_code)) # 保存成用股票代码命名的文档 return 0
def draw_charts(echarts_data): kline_data = echarts_data["data"] date = echarts_data["date"] kline = ( Kline().add_xaxis(xaxis_data=date).add_yaxis( series_name="Dow-Jones index", y_axis=kline_data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( legend_opts=opts.LegendOpts(is_show=False, pos_bottom=10, pos_left="center"), # 其中inside是支持鼠标缩放 datazoom_opts=[ opts.DataZoomOpts( is_show=True, type_="inside", xaxis_index=[0, 1, 2, 3, 4], range_start=50, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1, 2, 3, 4], type_="slider", range_start=50, range_end=100, ), ], # # 不知道为什么要分开三个写,可能是想通过xaxis_index分别配置 # 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), # ], yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), title_opts=opts.TitleOpts(title="my_echart"), 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" }, ], ), # 所有图的axis 连在一块 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().add_xaxis(xaxis_data=date).add_yaxis( series_name="MA5", y_axis=echarts_data['ma5'], is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, # 去掉折线上的小圆点 ).add_yaxis( series_name="MA20", y_axis=echarts_data['ma20'], is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, # 去掉折线上的小圆点 ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) # Kline And Line overlap_kline_line = kline.overlap(line) bar = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="Volume", y_axis=echarts_data['volume'], 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", 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), )) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="MACD", y_axis=echarts_data['macd'], 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), # 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, ), 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), )) macd_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="DIFF", y_axis=echarts_data['macd_diff'], # xaxis_index=2, # yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DEA", y_axis=echarts_data["macd_dea"], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ) # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) # MACD BAR And MACD Line bar_macd_line = bar_2.overlap(macd_line) # KDJ kdj_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="K", y_axis=echarts_data['kdj_k'], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="D", y_axis=echarts_data["kdj_d"], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="J", y_axis=echarts_data["kdj_j"], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), # markline_opts=opts.MarkLineOpts( # data=[100] # ), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=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, ), )) ###################### ## kdj的macd # Bar-2 (Overlap Bar + Line) macd_kdj_bar = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="MACD_KDJ", y_axis=echarts_data['kdj_macd'], 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), # 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, ), 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), )) macd_kdj_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="KDJ_DIFF", y_axis=echarts_data['kdj_macd_diff'], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="KDJ_DEA", y_axis=echarts_data["kdj_macd_dea"], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ) # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) # MACD BAR And MACD Line bar_macd_kdj_line = macd_kdj_bar.overlap(macd_kdj_line) ###################### # Grid Overlap + Bar grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="800px", animation_opts=opts.AnimationOpts(animation=False), )) # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format(kline_data)) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="30%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="35%", height="10%"), ) # 加上MACD grid_chart.add( bar_macd_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="45%", height="10%", ), ) # 加上KDJ grid_chart.add( kdj_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="55%", height="10%", ), ) # 加上KDJ的MACD grid_chart.add( bar_macd_kdj_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="65%", height="10%", ), ) grid_chart.render("300368.html")
def kline(self): data = self.calculate().to_dict('list') kline = ( Kline().add_xaxis(xaxis_data=data["date"]).add_yaxis( series_name="portfolio index", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), ).set_global_opts( 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)), 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), ], 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"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), # 三个图的 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["date"]).add_yaxis( series_name="MA5", y_axis=self.calculate_ma(day_count=5, data=data), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA10", y_axis=self.calculate_ma(day_count=10, data=data), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA20", y_axis=self.calculate_ma(day_count=20, data=data), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA30", y_axis=self.calculate_ma(day_count=30, data=data), 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["date"]).add_yaxis( series_name="Volumn", y_axis=data["volume"], 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), ), legend_opts=opts.LegendOpts(is_show=False), )) # Bar-2 (Overlap Bar + Line) bar_2 = (Bar().add_xaxis(xaxis_data=data["date"]).add_yaxis( series_name="MACD", y_axis=data["MACD"], 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["date"]).add_yaxis( series_name="DIFF", y_axis=data["DIFF"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DEA", y_axis=data["DEA"], 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="1500px", height="750px")) # 这个是为了把 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%"), ) makedir(self.path, 'kline') grid_chart.render( f"{self.path}\\kline\\{str(self.names)}_{time.strftime('%Y-%m-%d', time.localtime())}.html" )
class MyPyecharts(): kline_chart = None grid_chart = None def __init__(self, bar_data): self.bar_data = bar_data self.bar_data_datetime = list( self.bar_data.index.strftime("%Y-%m-%d %H:%M")) def kline(self): """""" if "_" in self.bar_data.symbol[0]: symbol_split = self.bar_data.symbol[0].split("_") series_name = "_".join( [symbol_split[0], symbol_split[1][-2:], symbol_split[2][-2:]]) else: series_name = self.bar_data.symbol[0] kline = Kline(init_opts=opts.InitOpts(width="1400px", height="800px")) kline.add_xaxis(xaxis_data=self.bar_data_datetime) kline.add_yaxis( series_name=series_name, yaxis_index=0, y_axis=self.bar_data[[ "open_price", "close_price", "low_price", "high_price" ]].values.tolist(), itemstyle_opts=opts.ItemStyleOpts(color="#ef232a", color0="#14b143", border_color="#8A0000", border_color0="#008F28", opacity=0.8), ) kline.set_global_opts( datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 0], range_start=0, range_end=100, ), opts.DataZoomOpts( is_show=True, type_="slider", xaxis_index=[0, 1], pos_top="95%", range_start=0, range_end=100, ), ], xaxis_opts=opts.AxisOpts( is_scale=True, type_="category", 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, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=0.8)), ), brush_opts=opts.BrushOpts( tool_box=[ "rect", "polygon", "keep", "lineX", "lineY", "clear" ], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), tooltip_opts=opts.TooltipOpts( is_show=True, 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=12, font_family="Arial", font_weight="lighter", ), ), toolbox_opts=opts.ToolboxOpts(orient="horizontal", pos_left="right", pos_top="0%"), legend_opts=opts.LegendOpts( is_show=True, type_="scroll", selected_mode="multiple", pos_left="left", pos_top="0%", legend_icon="roundRect", ), # 多图的 axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), ) self.kline_chart = kline def overlap_sma(self, sma_series: list = [5, 10, 20, 60]): # 在K线图上绘制 SMA 均线 SMA_series = sma_series SMA_line = (Line().add_xaxis( xaxis_data=self.bar_data_datetime).set_global_opts( xaxis_opts=opts.AxisOpts(type_="category"))) for i in SMA_series: sma_value = ta.SMA(np.array(self.bar_data["close_price"]), i) SMA_line.add_yaxis( series_name=f"SMA_{i}", y_axis=sma_value.tolist(), is_symbol_show=False, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8), label_opts=opts.LabelOpts(is_show=False), tooltip_opts=opts.TooltipOpts(is_show=False), ) self.kline_chart.overlap(SMA_line) def overlap_boll(self, timeperiod=14, nbdevup=2, nbdevdn=2, matype=0): # 在K线图上绘制 布林带 boll_up, boll_mid, boll_low = ta.BBANDS(np.array(self.bar_data["close_price"]),\ timeperiod=timeperiod, nbdevup=nbdevup, nbdevdn=nbdevdn, matype=matype) BOLL_line = (Line().add_xaxis( xaxis_data=self.bar_data_datetime).add_yaxis( series_name="布林上轨", y_axis=boll_up.tolist(), is_symbol_show=False, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8), label_opts=opts.LabelOpts(is_show=False), tooltip_opts=opts.TooltipOpts(is_show=False), ).add_yaxis( series_name="布林中轨", y_axis=boll_mid.tolist(), is_symbol_show=False, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8), label_opts=opts.LabelOpts(is_show=False), tooltip_opts=opts.TooltipOpts(is_show=False), ).add_yaxis( series_name="布林下轨", y_axis=boll_low.tolist(), is_symbol_show=False, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8), label_opts=opts.LabelOpts(is_show=False), tooltip_opts=opts.TooltipOpts(is_show=False), )) self.kline_chart.overlap(BOLL_line) def grid_volume(self, grid_index=1): """""" vol_bar = (Bar().add_xaxis( xaxis_data=self.bar_data_datetime).add_yaxis( series_name="成交量", y_axis=self.bar_data["volume"].tolist(), xaxis_index=grid_index, yaxis_index=grid_index, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(opacity=0.8, 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=grid_index, ), legend_opts=opts.LegendOpts(is_show=False), )) return vol_bar def grid_graph(self, grid_graph=None): # 创建组合图表画布对象 self.grid_chart = Grid( init_opts=opts.InitOpts(width="1900px", height="900px")) bar_data = [[ row["open_price"], row["close_price"], row["low_price"], row["high_price"] ] for ix, row in self.bar_data.iterrows()] self.grid_chart.add_js_funcs("var barData = {}".format(bar_data)) self.grid_chart.add( chart=self.kline_chart, grid_index=0, grid_opts=opts.GridOpts(pos_left="5%", pos_right="5%", pos_top="10%", height="60%"), ) self.grid_chart.add( chart=grid_graph, grid_index=1, grid_opts=opts.GridOpts(pos_left="5%", pos_right="5%", pos_top="75%", height="20%"), ) return self.grid_chart def render(self, html_name="render.html"): return self.grid_chart.render(html_name)
def plot_kline( df, rendered=True, ucolor="#ef232a", dcolor="#14b143", ucolorborder=None, dcolorborder=None, ucolorvolume=None, dcolorvolume=None, col="", ): """ 针对 dataframe 直接画出标准看盘软件的上k线图下成交量图的形式 :param df: :param rendered: :param ucolor: str for color when going up, default red in A stock as "#ef232a" :param dcolor: str for color when going down, default green in A stock as "#14b143" :param col: :return: """ # TODO: color changing seems to make no effect, possible issue with pyecharts if ucolorborder is None: ucolorborder = ucolor if dcolorborder is None: dcolorborder = dcolor if ucolorvolume is None: if ucolor != "#ffffff": ucolorvolume = ucolor else: ucolorvolume = ucolorborder if dcolorvolume is None: if dcolor != "#ffffff": dcolorvolume = dcolor else: dcolorvolume = dcolorborder kline = ( Kline().add_xaxis(xaxis_data=list(df["date"])).add_yaxis( series_name="", itemstyle_opts=opts.ItemStyleOpts( color=ucolor, color0=dcolor, border_color=ucolorborder, # ucolor, border_color0=dcolorborder, # dcolor, ), y_axis=list(zip(df["open"], df["close"], df["low"], df["high"])), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ], symbol="pin", symbol_size=[56, 40], # label_opts=opts.LabelOpts(color="#CCFFFF",position=["top", "bottom"]) ), ).set_global_opts( datazoom_opts=[ opts.DataZoomOpts( is_show=True, type_="slider", range_start=50, range_end=100, xaxis_index=[0, 1], ), opts.DataZoomOpts( is_show=False, type_="inside", range_start=50, range_end=100, xaxis_index=1, ), ], tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), )) if col is not None: for c in col: line = (Line().add_xaxis(xaxis_data=list(df["date"])).add_yaxis( series_name=c, y_axis=list(df[c]), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), )) kline = kline.overlap(line) if "volume" in df.columns: vl = list(df["volume"]) elif "amount" in df.columns: vl = list(df["amount"]) else: vl = [0 for _ in range(len(df))] bar = ( Bar().add_js_funcs("var barData = {}".format( list(df["close"] - df["open"]))).add_xaxis( xaxis_data=list(df["date"])).add_yaxis( series_name="", yaxis_data=vl, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode(""" function(params) {{ var colorList; if (barData[params.dataIndex]>0) {{ colorList = '{ucolor}'; }} else {{ colorList = '{dcolor}'; }} return colorList; }} """.format(ucolor=ucolorvolume, dcolor=dcolorvolume)) # escape {} when using format ), ).set_global_opts(tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), )) grid_chart = Grid() grid_chart.add_js_funcs("var barData = {}".format( list(df["close"] - df["open"]))) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="10%", pos_right="1%", pos_top="2%", height="65%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="1%", pos_top="71%", height="22%"), ) if rendered: return grid_chart.render_notebook() else: return grid_chart