def bar_with_brush() -> Bar: c = (Bar().add_xaxis(Faker.choose()).add_yaxis( "商家A", Faker.values()).add_yaxis("商家B", Faker.values()).set_global_opts( title_opts=opts.TitleOpts(title="Bar-Brush示例", subtitle="我是副标题"), brush_opts=opts.BrushOpts(), )) return c
def bar_datazoom_slider(xaxis,yaxis_name,yaxis,title_name) -> Bar: if isinstance(yaxis_name,str): c=( Bar() .add_xaxis(xaxis) .add_yaxis(yaxis_name,yaxis) .set_global_opts( title_opts=opts.TitleOpts(title=title_name), datazoom_opts=[opts.DataZoomOpts()], brush_opts=opts.BrushOpts(), toolbox_opts=opts.ToolboxOpts(), legend_opts=opts.LegendOpts(is_show=False), yaxis_opts=opts.AxisOpts(name="我是 Y 轴"), xaxis_opts=opts.AxisOpts(name="我是 X 轴"), ) ) elif isinstance(yaxis,list): c=Bar() c.add_xaxis(xaxis) for i in range(len(yaxis_name)): c.add_yaxis(yaxis_name[i],yaxis[i], gap="0%",category_gap="10%",is_selected=True) c.set_global_opts( title_opts=opts.TitleOpts(title=title_name), datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], #datazoom_opts=opts.DataZoomOpts(orient="vertical"), brush_opts=opts.BrushOpts(), toolbox_opts=opts.ToolboxOpts(), legend_opts=opts.LegendOpts(is_show=False), yaxis_opts=opts.AxisOpts(name="我是 Y 轴"), xaxis_opts=opts.AxisOpts(name="我是 X 轴"), ) c.set_series_opts( label_opts=opts.LabelOpts(is_show=True), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), opts.MarkPointItem(type_="average", name="平均值"), ] ) ) return c
def test_bar_with_brush(fake_writer): c = (Bar().add_xaxis(["A", "B", "C"]).add_yaxis( "series0", [1, 2, 4]).add_yaxis("series1", [2, 3, 6]).set_global_opts( title_opts=opts.TitleOpts(title="Bar-Brush示例", subtitle="我是副标题"), brush_opts=opts.BrushOpts(), )) c.render() _, content = fake_writer.call_args[0] assert_in("brush", content)
def draw_line(xlist, ylist): c = (Bar(init_opts=opts.InitOpts( width='1800px', height='900px', js_host="./", )).add_xaxis(xlist).add_yaxis("视频弹幕数", ylist).set_global_opts( title_opts=opts.TitleOpts("知识区TOP10弹幕视频"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), brush_opts=opts.BrushOpts(), ).render('./柱状图/知识区TOP10弹幕视频.html'))
def bar_with_brush(): obj_bar = Bar() obj_bar.add_xaxis(Faker.choose()) obj_bar.add_yaxis("商家A", Faker.values()) obj_bar.add_yaxis("商家B", Faker.values()) obj_bar.set_global_opts( title_opts=opts.TitleOpts(title="Bar-Brush示例", subtitle="副标题"), brush_opts=opts.BrushOpts() ) return obj_bar
def bar_datazoom_slider(self): bar = ( Bar(init_opts=opts.InitOpts(width="600px", height="300px")) .add_xaxis(["运行", "失败", "平均排名"]) .add_yaxis("", self.bar_data) .set_global_opts( title_opts=opts.TitleOpts(title="局数统计"), brush_opts=opts.BrushOpts(), ) ) bar.render(f"{self.report_dir}/bar.html")
def draw_line(xlist, ylist, ylist2): c = (Bar(init_opts=opts.InitOpts( width='1800px', height='900px', js_host="./", )).add_xaxis(xlist).add_yaxis("视频平均粉丝响应指数", ylist).add_yaxis( "视频最高粉丝响应指数", ylist2).set_global_opts( title_opts=opts.TitleOpts("各频道平均-最高粉丝响应指数"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts( rotate=-15)), brush_opts=opts.BrushOpts(), ).render('./柱状图/各频道平均-最高粉丝响应指数.html'))
def timelineChart(df): x = Faker.choose() tl = Timeline() for i in range(2015, 2020): bar = ( Bar() .add_xaxis(x) .add_yaxis("商家A", Faker.values()) .add_yaxis("商家B", Faker.values()) .set_global_opts( title_opts=opts.TitleOpts("某商店{}年营业额 - With Graphic 组件".format(i)), toolbox_opts=opts.ToolboxOpts(), brush_opts=opts.BrushOpts(), graphic_opts=[ opts.GraphicGroup( graphic_item=opts.GraphicItem( rotation=JsCode("Math.PI / 4"), bounding="raw", right=100, bottom=110, z=100, ), children=[ opts.GraphicRect( graphic_item=opts.GraphicItem( left="center", top="center", z=100 ), graphic_shape_opts=opts.GraphicShapeOpts( width=400, height=50 ), graphic_basicstyle_opts=opts.GraphicBasicStyleOpts( fill="rgba(0,0,0,0.3)" ), ), opts.GraphicText( graphic_item=opts.GraphicItem( left="center", top="center", z=100 ), graphic_textstyle_opts=opts.GraphicTextStyleOpts( text="某商店{}年营业额".format(i), font="bold 26px Microsoft YaHei", graphic_basicstyle_opts=opts.GraphicBasicStyleOpts( fill="#fff" ), ), ), ], ) ], ) ) tl.add(bar, "{}年".format(i)) return tl
def _draw_line(result: ClassifierResult) -> Line: # draw line chart x_axis = result.get_timestamp_list() y_axis = result.get_stage_list() line = Line(init_opts=opts.InitOpts( bg_color=constants.BACKGROUND_COLOR)) line.add_xaxis(x_axis) line.add_yaxis("stage", y_axis, is_step=False, is_symbol_show=True) line.set_global_opts( title_opts=opts.TitleOpts( title="Trend", subtitle="describe how these stages switching"), toolbox_opts=opts.ToolboxOpts(is_show=True), tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="cross"), brush_opts=opts.BrushOpts(x_axis_index="all", tool_box=["lineX"]), ) return line
def _draw_line(data_list: typing.List[ClassifierResult]) -> Line: # draw line chart x_axis = [str(i.timestamp) for i in data_list] y_axis = [i.stage for i in data_list] line = Line(init_opts=opts.InitOpts(bg_color=BACKGROUND_COLOR)) line.add_xaxis(x_axis) line.add_yaxis("stage", y_axis, is_step=False, is_symbol_show=True) line.set_global_opts( title_opts=opts.TitleOpts( title="Trend", subtitle="describe how these stages switching" ), toolbox_opts=opts.ToolboxOpts(is_show=True), tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", axis_pointer_type="cross" ), brush_opts=opts.BrushOpts(x_axis_index="all", tool_box=["lineX"]), ) return line
def bar_custom_bar_color(): # 小于50红色,50-100蓝色,其他绿色 color_function = """ function (params) { if (params.value > 0 && params.value < 50) { return 'red'; } else if (params.value > 50 && params.value < 100) { return 'blue'; } return 'green'; } """ obj_bar = Bar() obj_bar.add_xaxis(Faker.choose()) # 这里设置color不起作用 obj_bar.add_yaxis("商家A", Faker.values(),color='#C1C1C1',itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function))) obj_bar.add_yaxis("商家B", Faker.values(),color='#909090',itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function))) obj_bar.add_yaxis("商家C", Faker.values(),color='#404040',itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function))) obj_bar.set_global_opts( title_opts=opts.TitleOpts(title="Bar-自定义柱状颜色", subtitle="副标题"), brush_opts=opts.BrushOpts() ) return obj_bar
def get_chat_nums(message_path, contact_path): """ :param message_path: 预处理完成后的message表存储路径 :param contact_path: 预处理完成后的contact表存储路径 :return: """ # message_path = r'D:\wechet-anayze\pre-message-2.txt' # contact_path = r'D:\wechet-anayze\pre-recontact.csv' message = pd.read_csv(message_path, sep=',', encoding='utf-8', low_memory=False) contact = pd.read_csv(contact_path, sep=',', encoding='utf-8', low_memory=False) # 提取出联系人列表中用户名和备注名称 contact = contact[['username', 'conRemark']] # 将用户名提取出来 username = contact['username'].tolist() print(type(username)) # 将用户名及备注名提取为一个字典 contact_dict = dict(zip(contact['username'], contact['conRemark'])) # 联系人及其聊天次数集合 contact_sum_message = {} # 全部联系人聊天次数集合 sum_message = 0 # 联系人列表 uname_list = [] # 联系人列表对应的聊天次数列表 chat_num_list = [] # 遍历联系人列表,并逐一统计聊天次数 for uname in username: # 根据微信id获取真实姓名,key为真实姓名 key = contact_dict.get(uname) # 根据微信id统计聊天次数,value:聊天次数 value = (message['talker'] == uname).sum() # 过滤聊天次数为0的联系人,只保留聊天次数不为0的联系人 if value != 0: contact_sum_message[key] = value sum_message += value uname_list.append(key) # 这里需特别注意:value值也即聊天的次数格式是int64,但是pyecharts中如果传入的是int64时,最终渲染出的html文件中会数据会丢失, # 所以需转为int值(血泪教训) chat_num_list.append(int(value)) # print(contact_sum_message) print("总聊天次数: ", sum_message) # 使用pyecharts绘制柱状图 c = ( Bar(init_opts=opts.InitOpts(width="1600px", height="600px", page_title="聊天次数统计")) .add_xaxis(uname_list) .add_yaxis(series_name="聊天次数", y_axis=chat_num_list, color='#FF6666') .set_global_opts( # 标题配置 title_opts=opts.TitleOpts(title="聊天次数统计"), # X轴区域缩放配置项,可使用list同时配置多个配置项 datazoom_opts=[opts.DataZoomOpts(range_start=20, range_end=40), opts.DataZoomOpts(type_="inside")], # 区域选择组件 brush_opts=opts.BrushOpts(), # X坐标轴旋转 xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), # 工具箱组件 toolbox_opts=opts.ToolboxOpts(), # 图例配置 legend_opts=opts.LegendOpts(is_show=False), ) .set_series_opts( label_opts=opts.LabelOpts(is_show=False), # 配置最大值最小值刻度线 markline_opts=opts.MarkLineOpts( data=[ opts.MarkLineItem(type_="min", name="最小值"), opts.MarkLineItem(type_="max", name="最大值"), opts.MarkLineItem(type_="average", name="平均值"), ] ), ) .render("chat_num_count.html") )
def kline_profession_example() -> Grid: data = [ [2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], [2255.77, 2270.28, 2253.31, 2276.22], ] 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 x_data = ["2017-7-{}".format(i + 1) for i in range(31)] kline = (Kline().add_xaxis(xaxis_data=x_data).add_yaxis( series_name="Dow-Jones index", y_axis=data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( title_opts=opts.TitleOpts( title="复杂版 Kline 示例 (Kline + Line + Bar)", subtitle="MA 就以(2, 4, 6, 8为例)", ), 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=False, pos_bottom=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", ), )) line = (Line().add_xaxis(xaxis_data=x_data).add_yaxis( series_name="MA2", y_axis=calculate_ma(day_count=2, d=data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA4", y_axis=calculate_ma(day_count=4, d=data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA6", y_axis=calculate_ma(day_count=6, d=data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA8", y_axis=calculate_ma(day_count=8, d=data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) bar = (Bar().add_xaxis(xaxis_data=x_data).add_yaxis( series_name="Volume", yaxis_data=[[i, data[i][3], 1 if data[i][0] > data[i][1] else -1] for i in range(len(data))], 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 overlap_kline_line = kline.overlap(line) # Grid Overlap + Bar grid_chart = Grid() grid_chart.add( overlap_kline_line, 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="70%", height="16%"), ) return grid_chart
def kline_pro(kline: List[dict], ma: List[dict], macd: List[dict], fx: List[dict] = None, bi: List[dict] = None, xd: List[dict] = None, bs: List[dict] = None, title: str = "缠中说禅K线分析", width: str = "1200px", height: str = '680px') -> Grid: """绘制缠中说禅K线分析结果 :param kline: K线 :param ma: 均线 :param macd: MACD :param fx: 分型识别结果 :param bi: 笔识别结果 :param xd: 线段识别结果 :param bs: 买卖点 :param title: 图表标题 :param width: 图表宽度 :param height: 图表高度 :return: 用Grid组合好的图表 """ # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ bg_color = "#1f212d" # 背景 up_color = "#F9293E" down_color = "#00aa3b" init_opts = opts.InitOpts(bg_color=bg_color, width=width, height=height, animation_opts=opts.AnimationOpts(False)) title_opts = opts.TitleOpts( title=title, pos_top="1%", title_textstyle_opts=opts.TextStyleOpts(color=up_color, font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color=down_color, font_size=12)) label_not_show_opts = opts.LabelOpts(is_show=False) legend_not_show_opts = opts.LegendOpts(is_show=False) red_item_style = opts.ItemStyleOpts(color=up_color) green_item_style = opts.ItemStyleOpts(color=down_color) k_style_opts = opts.ItemStyleOpts(color=up_color, color0=down_color, border_color=up_color, border_color0=down_color, opacity=0.8) legend_opts = opts.LegendOpts(is_show=True, pos_top="1%", pos_left="30%", item_width=14, item_height=8, textstyle_opts=opts.TextStyleOpts( font_size=12, color="#0e99e2")) brush_opts = opts.BrushOpts(tool_box=["rect", "polygon", "keep", "clear"], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX") axis_pointer_opts = opts.AxisPointerOpts(is_show=True, link=[{ "xAxisIndex": "all" }]) dz_inside = opts.DataZoomOpts(False, "inside", xaxis_index=[0, 1, 2]) dz_slider = opts.DataZoomOpts(True, "slider", xaxis_index=[0, 1, 2], pos_top="96%", pos_bottom="0%") yaxis_opts = opts.AxisOpts(is_scale=True, axislabel_opts=opts.LabelOpts( color="#c7c7c7", font_size=8, position="inside")) grid0_xaxis_opts = opts.AxisOpts( type_="category", grid_index=0, axislabel_opts=label_not_show_opts, split_number=20, min_="dataMin", max_="dataMax", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False)) tool_tip_opts = opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", position=JsCode(""" function (pos, params, el, elRect, size) { var obj = {top: 10}; obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30; return obj; } """), textstyle_opts=opts.TextStyleOpts(color="#000"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ dts = [x['dt'] for x in kline] k_data = [[x['open'], x['close'], x['low'], x['high']] for x in kline] vol = [] for row in kline: item_style = red_item_style if row['close'] > row[ 'open'] else green_item_style bar = opts.BarItem(value=row['vol'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) macd_bar = [] for row in macd: item_style = red_item_style if row['macd'] > 0 else green_item_style bar = opts.BarItem(value=round(row['macd'], 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd_bar.append(bar) diff = [round(x['diff'], 4) for x in macd] dea = [round(x['dea'], 4) for x in macd] # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) chart_k.add_yaxis(series_name="Kline", y_axis=k_data, itemstyle_opts=k_style_opts) chart_k.set_global_opts(legend_opts=legend_opts, datazoom_opts=[dz_inside, dz_slider], yaxis_opts=yaxis_opts, tooltip_opts=tool_tip_opts, axispointer_opts=axis_pointer_opts, brush_opts=brush_opts, title_opts=title_opts, xaxis_opts=grid0_xaxis_opts) # 均线图 # ------------------------------------------------------------------------------------------------------------------ chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) ma_keys = [x for x in ma[0].keys() if "ma" in x][:3] ma_colors = ["#39afe6", "#da6ee8", "#00940b"] for i, k in enumerate(ma_keys): y_data = [x[k] for x in ma] chart_ma.add_yaxis(series_name=k.upper(), y_axis=y_data, is_smooth=True, is_selected=False, symbol_size=0, label_opts=label_not_show_opts, linestyle_opts=opts.LineStyleOpts( opacity=0.8, width=1.0, color=ma_colors[i])) chart_ma.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_ma) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ if fx: fx_dts = [x['dt'] for x in fx] fx_val = [x['fx'] for x in fx] chart_fx = Scatter() chart_fx.add_xaxis(fx_dts) chart_fx.add_yaxis(series_name="FX", y_axis=fx_val, is_selected=False, symbol="circle", symbol_size=6, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts( color="rgba(152, 147, 193, 1.0)", )) chart_fx.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_fx) if bi: bi_dts = [x['dt'] for x in bi] bi_val = [x['bi'] for x in bi] chart_bi = Scatter() chart_bi.add_xaxis(bi_dts) chart_bi.add_yaxis(series_name="BI", y_axis=bi_val, is_selected=True, symbol="diamond", symbol_size=10, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts( color="rgba(184, 117, 225, 1.0)", )) chart_bi.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_bi) if xd: xd_dts = [x['dt'] for x in xd] xd_val = [x['xd'] for x in xd] chart_xd = Scatter() chart_xd.add_xaxis(xd_dts) chart_xd.add_yaxis(series_name="XD", y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10, itemstyle_opts=opts.ItemStyleOpts( color="rgba(37, 141, 54, 1.0)", )) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_xd) if bs: b_dts = [x['dt'] for x in bs if x['mark'] == 'buy'] if len(b_dts) > 0: b_val = [x['buy'] for x in bs if x['mark'] == 'buy'] chart_b = Scatter() chart_b.add_xaxis(b_dts) chart_b.add_yaxis(series_name="BUY", y_axis=b_val, is_selected=False, symbol="arrow", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts( color="#f31e1e", )) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_b) s_dts = [x['dt'] for x in bs if x['mark'] == 'sell'] if len(s_dts) > 0: s_val = [x['sell'] for x in bs if x['mark'] == 'sell'] chart_s = Scatter() chart_s.add_xaxis(s_dts) chart_s.add_yaxis(series_name="SELL", y_axis=s_val, is_selected=False, symbol="pin", symbol_size=12, itemstyle_opts=opts.ItemStyleOpts( color="#45b97d", )) chart_s.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_s) # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) chart_vol.add_yaxis(series_name="Volume", y_axis=vol, bar_width='60%') chart_vol.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=True, font_size=8, color="#9b9da9"), ), yaxis_opts=yaxis_opts, legend_opts=legend_not_show_opts, ) # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) chart_macd.add_yaxis(series_name="MACD", y_axis=macd_bar, bar_width='60%') chart_macd.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, color="#c7c7c7"), ), legend_opts=opts.LegendOpts(is_show=False), ) line = Line() line.add_xaxis(dts) line.add_yaxis(series_name="DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#da6ee8")) line.add_yaxis(series_name="DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#39afe6")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="86%", height="10%") grid_chart = Grid(init_opts) grid_chart.add(chart_k, grid_opts=grid0_opts) grid_chart.add(chart_vol, grid_opts=grid1_opts) grid_chart.add(chart_macd, grid_opts=grid2_opts) return grid_chart
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 ka_to_echarts(ka: KlineAnalyze, width="1500px", height='800px'): # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ bg_color = "#1f212d" # 背景 up_color = "#F9293E" down_color = "#00aa3b" init_opts = opts.InitOpts(bg_color=bg_color, width=width, height=height, animation_opts=opts.AnimationOpts(False)) title_opts = opts.TitleOpts(title="{} - {}".format(ka.symbol, ka.name), subtitle="from {} to {}".format(ka.start_dt, ka.end_dt), pos_top="1%", title_textstyle_opts=opts.TextStyleOpts(color=up_color, font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color=down_color, font_size=12)) label_not_show_opts = opts.LabelOpts(is_show=False) legend_not_show_opts = opts.LegendOpts(is_show=False) red_item_style = opts.ItemStyleOpts(color=up_color) green_item_style = opts.ItemStyleOpts(color=down_color) k_style_opts = opts.ItemStyleOpts(color=up_color, color0=down_color, border_color=up_color, border_color0=down_color, opacity=0.8) legend_opts = opts.LegendOpts(is_show=True, pos_top="1%", pos_left="30%", item_width=14, item_height=8, textstyle_opts=opts.TextStyleOpts(font_size=12, color="#0e99e2")) brush_opts = opts.BrushOpts(tool_box=["rect", "polygon", "keep", "clear"], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX") axis_pointer_opts = opts.AxisPointerOpts(is_show=True, link=[{"xAxisIndex": "all"}]) dz_inside = opts.DataZoomOpts(False, "inside", xaxis_index=[0, 1, 2]) dz_slider = opts.DataZoomOpts(True, "slider", xaxis_index=[0, 1, 2], pos_top="96%", pos_bottom="0%") yaxis_opts = opts.AxisOpts(is_scale=True, axislabel_opts=opts.LabelOpts(color="#c7c7c7", font_size=8, position="inside")) grid0_xaxis_opts = opts.AxisOpts(type_="category", grid_index=0, axislabel_opts=label_not_show_opts, split_number=20, min_="dataMin", max_="dataMax", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False)) tool_tip_opts = opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", position=JsCode(""" function (pos, params, el, elRect, size) { var obj = {top: 10}; obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30; return obj; } """), textstyle_opts=opts.TextStyleOpts(color="#000"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ dts = [x['dt'] for x in ka.kline_raw] k_data = [[x['open'], x['close'], x['low'], x['high']] for x in ka.kline_raw] ma = ka.ma vol = [] for row in ka.kline_raw: item_style = red_item_style if row['close'] > row['open'] else green_item_style bar = opts.BarItem(value=row['vol'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) macd = [] for row in ka.macd: item_style = red_item_style if row['macd'] > 0 else green_item_style bar = opts.BarItem(value=round(row['macd'], 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd.append(bar) diff = [round(x['diff'], 4) for x in ka.macd] dea = [round(x['dea'], 4) for x in ka.macd] # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) chart_k.add_yaxis(series_name="Kline", y_axis=k_data, itemstyle_opts=k_style_opts) chart_k.set_global_opts( legend_opts=legend_opts, datazoom_opts=[dz_inside, dz_slider], yaxis_opts=yaxis_opts, tooltip_opts=tool_tip_opts, axispointer_opts=axis_pointer_opts, brush_opts=brush_opts, title_opts=title_opts, xaxis_opts=grid0_xaxis_opts ) # 均线图 # ------------------------------------------------------------------------------------------------------------------ chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) ma_keys = [x for x in ma[0].keys() if "ma" in x][:3] ma_colors = ["#39afe6", "#da6ee8", "#00940b"] for i, k in enumerate(ma_keys): y_data = [x[k] for x in ma] chart_ma.add_yaxis(series_name=k.upper(), y_axis=y_data, is_smooth=True, is_selected=False, symbol_size=0, label_opts=label_not_show_opts, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color=ma_colors[i])) chart_ma.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_ma) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ fx_dts = [x['dt'] for x in ka.fx_list] fx_val = [x['fx'] for x in ka.fx_list] chart_fx = Scatter() chart_fx.add_xaxis(fx_dts) chart_fx.add_yaxis(series_name="FX", y_axis=fx_val, is_selected=False, symbol="circle", symbol_size=6, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts(color="rgba(152, 147, 193, 1.0)",)) chart_fx.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_fx) bi_dts = [x['dt'] for x in ka.bi_list] bi_val = [x['bi'] for x in ka.bi_list] chart_bi = Scatter() chart_bi.add_xaxis(bi_dts) chart_bi.add_yaxis(series_name="BI", y_axis=bi_val, is_selected=True, symbol="diamond", symbol_size=10, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts(color="rgba(184, 117, 225, 1.0)",)) chart_bi.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_bi) xd_dts = [x['dt'] for x in ka.xd_list] xd_val = [x['xd'] for x in ka.xd_list] chart_xd = Scatter() chart_xd.add_xaxis(xd_dts) chart_xd.add_yaxis(series_name="XD", y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10, itemstyle_opts=opts.ItemStyleOpts(color="rgba(37, 141, 54, 1.0)",)) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_xd) # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) chart_vol.add_yaxis(series_name="Volume", y_axis=vol, bar_width='60%') chart_vol.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=True, font_size=8, color="#9b9da9"), ), yaxis_opts=yaxis_opts, legend_opts=legend_not_show_opts, ) # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) chart_macd.add_yaxis(series_name="MACD", y_axis=macd, bar_width='60%') chart_macd.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, color="#c7c7c7"), ), legend_opts=opts.LegendOpts(is_show=False), ) line = Line() line.add_xaxis(dts) line.add_yaxis(series_name="DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#da6ee8")) line.add_yaxis(series_name="DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#39afe6")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="86%", height="10%") grid_chart = Grid(init_opts) grid_chart.add(chart_k, grid_opts=grid0_opts) grid_chart.add(chart_vol, grid_opts=grid1_opts) grid_chart.add(chart_macd, grid_opts=grid2_opts) return grid_chart
# -*- coding: utf-8 -*- """ Created on Fri Dec 11 15:54:45 2020 @author: Administrator """ from pyecharts import options as opts from pyecharts.charts import Bar import pandas as pd data = pd.read_excel('info_movies.xls') score = data['score'].value_counts().sort_index() x = score.index.tolist() y = score.tolist() bar = Bar() bar.add_xaxis(x) bar.add_yaxis('电影评分', y) bar.set_global_opts( title_opts={'text': "电影评分分布", 'subtext': "来源于豆瓣电影top250排名"}, brush_opts=opts.BrushOpts(), toolbox_opts=opts.ToolboxOpts(), datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), visualmap_opts=opts.VisualMapOpts(max_=50) ) bar.render("templates/bar_score.html")
price_list = cursor.fetchall() sum_price = 0 number = len(price_list) for price in price_list: sum_price += int(price[0].replace('元/月', '')) average = sum_price / number # 5837.533109807208 average_list.append(format(average, '.2f')) return average_list price_list = select_average_price() # 柱状图 bar_obj = ( Bar(init_opts=options.InitOpts(theme=ThemeType.MACARONS)) \ .add_xaxis((city_list)) \ .add_yaxis("", price_list) \ .set_global_opts(title_opts=options.TitleOpts("租房平均价格元/月", subtitle='仅供参考'), toolbox_opts=options.ToolboxOpts(), # 工具栏选项 brush_opts=options.BrushOpts() # 工具刷对象 ) ) # 饼状图 b_list = [list(i) for i in zip(city_list, price_list)] pie_ogj = (Pie().add("", b_list).set_series_opts(label_opts=options.LabelOpts( formatter="{b}: {c}"))) # page对象用于整合地图 p = Page(layout=Page.SimplePageLayout) p.add(pie_ogj, bar_obj) p.render("一线城市租房信息整合.html")
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 gen_kline_plot( stock_data: pd.DataFrame, chart_data: typing.Dict[str, typing.List[typing.List[typing.Union[float, int]]]], ) -> Kline: xaxis_index, series_index = get_subgraph_indices(chart_data) kline_data = [ list(kline_dict.values()) for kline_dict in stock_data[ ["open", "close", "min", "max"]].to_dict("records") ] kline = Kline(init_opts=opts.InitOpts(animation_opts=opts.AnimationOpts( animation=False), )) kline.add_xaxis(xaxis_data=chart_data["categoryData"]) kline.add_yaxis( series_name="kline", y_axis=kline_data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ) kline.set_global_opts( legend_opts=opts.LegendOpts(is_show=True, pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=xaxis_index, range_start=85, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=xaxis_index, type_="slider", pos_top="85%", range_start=85, range_end=100, ), ], yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, 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=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", ), ) return kline
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_charts(): df_merge = get_data(3650) kline_data = pd.DataFrame(df_merge, columns=[2, 5, 4, 3]).values.tolist() xaxis = pd.to_datetime(df_merge[0], unit='ms').dt.strftime('%Y-%m-%d').to_list() kline = (Kline().add_xaxis(xaxis_data=xaxis).add_yaxis( series_name="证券板块指数", 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"), 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="85%", range_start=0, range_end=100, ), ], yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, 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": "#00da3c" }, { "value": -1, "color": "#ec0000" }, ], ), 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", ), )) array_volume = df_merge['两市成交额'].values.tolist() bar_yaxis = [round(i / 100000000, 1) for i in array_volume] bar = (Bar().add_xaxis(xaxis_data=xaxis).add_yaxis( series_name="两市成交量(亿元)", y_axis=bar_yaxis, 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=3, axislabel_opts=opts.LabelOpts(is_show=True), 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), title_opts=opts.TitleOpts(title="证券板块与两市成交量(亿元)对比")).set_series_opts( markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem( y=10000)]))) # Grid Overlap + Bar grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", 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%"), ) grid_chart.render("证券-两市成交额对比.html") print("done")
def draw_charts(kline_data ,canshu ={} ,canshu2={},vol_bar=False,markline_show1 =False ,markline_show2 =False, path = '0501'): ''' df['candle_begin_time','open','high','low','close','volume'] [['candle_begin_time','open','high','low','close','volume']] kdata = df[['open', 'high', 'low', 'close']].values.tolist() df['candle_begin_time'].values.tolist() :return: ''' df = kline_data.copy() df['candle_begin_time'] = pd.to_datetime(df['candle_begin_time']) time_list = df['candle_begin_time'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S')).values.tolist() vol = df['volume'].values.tolist() kline = Kline() kline.add_xaxis(xaxis_data=time_list) signal_pos_list = [] if 'signal' in df.columns: print('signal,存在!') df['pos'] = df['signal'].shift(1) for i in df[df['pos'] > 0].index: bar0 = df.iloc[i] sig_pos0 = opts.MarkPointItem(name="做多", coord=[bar0['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'),bar0.low -2], value='买', symbol ='circle', symbol_size =[20,40], itemstyle_opts = {'color': 'red'}) signal_pos_list.append(sig_pos0) for i in df[df['pos'] < 0].index: bar0 = df.iloc[i] sig_pos0 = opts.MarkPointItem(name="做空", coord=[bar0['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'),bar0.high +3], value='卖', symbol='circle', symbol_size=[20, 40], itemstyle_opts={'color': 'blue'}) signal_pos_list.append(sig_pos0) for i in df[df['pos'] == 0].index: bar0 = df.iloc[i] sig_pos0 = opts.MarkPointItem(name="平仓", coord=[bar0['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'),bar0.low - 2], value='平', symbol ='triangle', symbol_size =[20,40], itemstyle_opts = {'color': 'green'}) signal_pos_list.append(sig_pos0) else : df['pos'] =None markline =[] if markline_show1 and ('signal' in df.columns) : area_index_list =[i for i in df[(df['pos'] ==0)|(df['pos'] >0)|(df['pos'] <0)].index] for ix,i in enumerate(area_index_list): if ix+1 > len(area_index_list)-1: break i_now = df.iloc[area_index_list[ix]] i_next = df.iloc[area_index_list[ix+1]] if (i_now['pos'] >0) or (i_now['pos'] <0) : log_info = f"价差:={i_next['open']-i_now['open']}--({i_next['open']}-{i_now['open']})" else : log_info =f"平仓:{i_next['open']}---开仓:{i_now['open']}" sig_area = [{"xAxis": i_now['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'), "yAxis": i_now['open'] , "value": None}, {"xAxis": i_next['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'), "yAxis": i_now['open'], "value":log_info}] sig_area_v = [{"xAxis": i_next['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'), "yAxis": i_now['open'] , "value": None}, {"xAxis": i_next['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'), "yAxis": i_next['open'], "value":None}] markline.append(sig_area) markline.append(sig_area_v) elif markline_show2 and ('signal' in df.columns): area_index_list =[i for i in df[(df['pos'] ==0)|(df['pos'] >0)|(df['pos'] <0)].index] for ix,i in enumerate(area_index_list): i_now = df.iloc[area_index_list[ix]] i_1_now = df.iloc[area_index_list[ix-1]] if ix != 0 else 0 if i_now['pos'] == 0: log_info = f"交易价: {round(i_now['open'], 1)} +- 2__盈亏:{round(i_now['open'], 1) - round(i_1_now['open'], 1)}" else: log_info = f"交易价: {round(i_now['open'],1)} +- 2" sig_area = [{"xAxis": i_now['candle_begin_time'].strftime('%Y-%m-%d %H:%M:%S'), "yAxis": i_now['open'] , "value": None}, {"xAxis": (i_now['candle_begin_time']+timedelta(minutes=15)).strftime('%Y-%m-%d %H:%M:%S'), "yAxis": i_now['open'], "value":log_info}] markline.append(sig_area) colors = {'red': 'rgb((220,20,60)','red2': 'rgb((250,20,40)', 'yangzi': 'rgb(255,0,255)', 'zi': 'rgb(128,0,128)', 'sehnzi': 'rgb(148,0,211)', 'blue': 'rgb(0,0,255)', 'qing': 'rgb(0,255,255)', 'black': 'rgb(0,0,0)', 'shengreen': 'rgb(157,255,212)', 'green': 'rgb(0,255,0)', 'yellow': 'rgb(255,255,0)', 'glod': 'rgb(218,165,32)', 'orange': 'rgb(255,165,0)', 'brown': 'rgb(165,42,42)'} kline.add_xaxis(xaxis_data=time_list) kline.add_yaxis(series_name="oclh", xaxis_index=1, yaxis_index=1, y_axis =df.loc[:, ['open', 'close', 'low', 'high']].values.tolist(), markline_opts=opts.MarkLineOpts(data=markline, linestyle_opts=opts.LineStyleOpts(type_='dotted',width=3,color='red',opacity=0.5), label_opts=opts.LabelOpts(position="right", color="blue", font_size=13),), #官网给出的样本 markpoint_opts=opts.MarkPointOpts(data=signal_pos_list), itemstyle_opts=opts.ItemStyleOpts(color="#ec0090", color0="#00aa3c"), ) kline.set_global_opts( legend_opts=opts.LegendOpts(is_show=True,pos_top=30, pos_left="left",orient='vertical'), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 1], range_start=90, range_end=100, orient='vertical'), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], type_="slider", pos_top="20%", range_start=90, range_end=100,orient='vertical'),], 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 = 'K_line', pos_top='middle', title_textstyle_opts=opts.TextStyleOpts( color='black',font_weight='bold' ,font_size=20)), tooltip_opts=opts.TooltipOpts( trigger="axis", trigger_on='"mousemove"',#click|mousemove axis_pointer_type="cross", is_show_content=True, is_always_show_content=True, background_color="rgba(20, 105, 245, 0.1)", border_width=1, border_color= "#ccc", position = ['70%','30%'], textstyle_opts=opts.TextStyleOpts(font_size=10,color="#000"),), visualmap_opts=opts.VisualMapOpts( is_show=True, 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"),), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX",), ) if len(canshu.keys())>0: cos = list(colors.values()) line = Line() for k,v in canshu.items(): line.add_xaxis(xaxis_data=time_list) line.set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) co = cos.pop() line.add_yaxis( series_name=k, y_axis = [y for y in v.values.tolist() if y != np.nan], xaxis_index=1, yaxis_index=1, is_smooth=False, is_connect_nones=False,# 是否连接空数据 is_symbol_show=False,#是否显示值的位置,默认显示。 color = co, is_hover_animation = False, # 是否开启 hover 在拐点标志上的提示动画效果。 linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.9,color=co), label_opts=opts.LabelOpts(is_show =True,position='middle',distance=2,rotate=5,color = 'rgb(165,42,42)'), itemstyle_opts=opts.ItemStyleOpts(color=co),) kline = kline.overlap(line) grid_chart = Grid(init_opts=opts.InitOpts(width = "1500px",height= "700px",theme=ThemeType.DARK)) grid_chart.add(kline,grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%",pos_top='4%' ,height="70%")) if( vol_bar == True) or (len(canshu2.keys())==0): bar = Bar() bar.add_xaxis(xaxis_data=time_list) bar.add_yaxis( series_name="volume", y_axis=vol, xaxis_index=1, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) bar.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=True), ) grid_chart.add(bar,grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="80%", height="15%"),) if len(canshu2.keys())>0 : line2 = Line() line2.add_xaxis(xaxis_data=time_list) for i, k in enumerate(canshu2.keys()): co = random.choice(list(colors.values())) line2.add_yaxis( series_name=k, y_axis=[y for y in canshu2[k].values.tolist()], xaxis_index=1, yaxis_index=i + 1, is_smooth=True, is_symbol_show=False, is_hover_animation=True, color=co, z_level=0, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.5, color=co), label_opts=opts.LabelOpts(is_show=False), ) if k == list(canshu2.keys())[-1]: continue line2.extend_axis(yaxis=opts.AxisOpts(name=k, type_="value", position="right", min_=None, max_=None, axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color=co)), axislabel_opts=opts.LabelOpts(formatter="{value}"), )) line2.set_global_opts(xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, split_number=20, min_="dataMin", max_="dataMax", 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), ), yaxis_opts=opts.AxisOpts(name=k, grid_index=i + 1, position='right', splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), min_=None, max_=None, is_scale=True, offset=50, ), ) grid_chart.add(line2,grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="75%", height="23%"),is_control_axis_index=True) tab = Tab() zijin_data = (kline_data['per_lr'].cumsum()) zijin_data.fillna(method='ffill', inplace=True) zijin_line = Line(init_opts=opts.InitOpts(width = "1500px",height= "700px",theme=ThemeType.DARK)).add_xaxis(time_list) zijin_line.add_yaxis(series_name="zijin_line:", y_axis=zijin_data.values, color="#FF0000") zijin_line.set_global_opts( datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], title_opts=opts.TitleOpts(title="资金曲线变化"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), yaxis_opts = opts.AxisOpts( is_scale=True, 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=True) ) tab.add(grid_chart,'kline' ) tab.add(zijin_line,'资金曲线变化' ) tab.render(f"{path}.html") html0 = tab.render(f"{path}.html") if os.path.exists(html0): print("ok!保存在:") print(html0) else: print('保存失败!')
def draw_chan(stock, stock_df, kc, end_time, period): # stock_df_original = stock_df[[ 'date', 'open', 'close', 'low', 'high', 'money' ]] stock_df_bi = kc.getFenBI_df()[['date', 'chan_price']] stock_df_xd = kc.getFenDuan_df()[['date', 'chan_price']] kline = ( # Kline({"theme": ThemeType.DARK}) Kline().add_xaxis( xaxis_data=stock_df_original['date'].tolist(), ).add_yaxis( series_name=stock, y_axis=stock_df_original[['open', 'close', 'low', 'high']].tolist(), itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0="#00da3c"), #添加用 Hex 字符串表示的红和绿两种颜色,对应着 K线涨和跌的颜色。 ).set_global_opts( title_opts=opts.TitleOpts(title="缠论", ), 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), toolbox_opts=opts.ToolboxOpts(), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", #xaxis_index=[0, 1], range_start= 0, #添加两个「数据区域缩放」功能,一个看的到(用鼠标拉缩图最下面的 slider),一个看不到(用鼠标直接在图中拉缩),并且设置 xaxis_index =[0,1],表示用 K 线图(index 0)来控制柱状图(index 1)。 range_end=100, ), opts.DataZoomOpts( is_show=True, #xaxis_index=[0, 1], type_="slider", pos_top="90%", range_start= 0, #index为1和2的两幅图的数据局部伸缩跟着index0那幅图,这样就实现了用一根x轴的slider可以任意缩放三幅图的数据 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=3, 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", ), )) Biline = ( Line().add_xaxis(xaxis_data=stock_df_bi['date'].tolist()).add_yaxis( series_name='笔', y_axis=stock_df_bi['chan_price'].tolist(), is_smooth=False, is_connect_nones=True, is_hover_animation=False, #linestyle_opts=opts.LineStyleOpts(color="red",width=2, type_="dashed"), linestyle_opts=opts.LineStyleOpts(color="red", width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=True), ) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) overlap = kline.overlap(Biline) crp = CentralRegionProcess(kc.getFenDuan_df(), kc, isdebug=False) crp.define_central_region() stock_zs_x, stock_zs_y = crp.convert_to_graph_data() if (stock_df_xd is not None) and (len(stock_zs_x) != 0): # print('if') for i in range(0, len(stock_zs_x), 2): XD_line = ( Line().add_xaxis(xaxis_data=stock_df_xd['date'].tolist()). add_yaxis( series_name='段', y_axis=stock_df_xd['chan_price'].tolist(), is_smooth=False, is_connect_nones=True, is_hover_animation=False, #linestyle_opts=opts.LineStyleOpts(color="red",width=2, type_="dashed"), linestyle_opts=opts.LineStyleOpts(color="blue", width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=[[{ 'xAxis': stock_zs_x[i], 'yAxis': stock_zs_y[i] }, { 'xAxis': stock_zs_x[i + 1], 'yAxis': stock_zs_y[i + 1] }]])) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) elif stock_df_xd is not None: # print('elif') XD_line = ( Line().add_xaxis(xaxis_data=stock_df_xd['date'].tolist()). add_yaxis( series_name='段', y_axis=stock_df_xd['chan_price'].tolist(), is_smooth=False, is_connect_nones=True, is_hover_animation=False, #linestyle_opts=opts.LineStyleOpts(color="red",width=2, type_="dashed"), linestyle_opts=opts.LineStyleOpts(color="blue", width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), )) overlap = overlap.overlap(XD_line) # MA_line = ( # Line() # .add_xaxis(xaxis_data=stock_df_original['date'].tolist(),) # .add_yaxis( # series_name="MA5", # y_axis= talib.SMA(stock_df['close'],timeperiod = 5).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .add_yaxis( # series_name="MA10", # y_axis= talib.SMA(stock_df['close'],timeperiod = 10).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .add_yaxis( # series_name="MA13", # y_axis= talib.SMA(stock_df['close'],timeperiod = 13).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .add_yaxis( # series_name="MA34", # y_axis= talib.SMA(stock_df['close'],timeperiod = 34).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) # ) # Volume_Bar = ( # Bar() # .add_xaxis(xaxis_data=stock_df_original['date'].tolist()) # .add_yaxis( # series_name="money", # yaxis_data=stock_df_original['money'].tolist(), # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # markline_opts=opts.MarkLineOpts( # data=[opts.MarkLineItem(type_="average", name="平均值")] # ), # itemstyle_opts=opts.ItemStyleOpts( # color=JsCode( # """ # function(params) { # var colorList; # if (params.data >= 0) { # colorList = '#ef232a'; # } else { # colorList = '#14b143'; # } # return colorList; # } # """ # # """ # # 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='', # ), # xaxis_opts=opts.AxisOpts( # type_="category", # grid_index=2, # is_scale=True, # # axislabel_opts=opts.LabelOpts(is_show=False), # 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=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), # splitarea_opts=opts.SplitAreaOpts( # is_show=True, # areastyle_opts=opts.AreaStyleOpts(opacity=1) # ), # ), # # xaxis_opts=opts.AxisOpts(is_scale=True), # legend_opts=opts.LegendOpts(is_show=False), # datazoom_opts=opts.DataZoomOpts(type_="inside"), # ) # ) # # overlap = overlap.overlap(Volume_Bar) print("it's here") if len(stock_zs_x) != 0: for i in range(0, len(stock_zs_x), 2): zs1_line = (Line().add_xaxis( xaxis_data=stock_zs_x[i:i + 2], ).add_yaxis( series_name="中枢", y_axis=np.append(stock_zs_y[i], stock_zs_y[i]), is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs2_line = (Line().add_xaxis( xaxis_data=stock_zs_x[i:i + 2], ).add_yaxis( series_name="中枢", y_axis=np.append(stock_zs_y[i + 1:i + 2], stock_zs_y[i + 1:i + 2]), is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs3_line = (Line().add_xaxis(xaxis_data=np.append( stock_zs_x[i:i + 1], stock_zs_x[i:i + 1])).add_yaxis( series_name="中枢", y_axis=stock_zs_y[i:i + 2], is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs4_line = (Line().add_xaxis(xaxis_data=np.append( stock_zs_x[i + 1:i + 2], stock_zs_x[i + 1:i + 2])).add_yaxis( series_name="中枢", y_axis=stock_zs_y[i:i + 2], is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs1 = zs1_line.overlap(zs2_line) zs2 = zs3_line.overlap(zs4_line) zs = zs1.overlap(zs2) overlap.overlap(zs) overlap.render("diagram/{0}@{1}#{2}.html".format(stock[0:6], end_time[0:10], period)) print("it's done")
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 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
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
import requests from lxml import etree from pyecharts.charts import Bar from pyecharts import options def get_city_money(): url = 'https://www.maigoo.com/news/480610.html' res = requests.get(url).text ele = etree.HTML(res) city = ele.xpath('//table[@class="mod_table"]/tr/td[2]/text()') money = ele.xpath('//table[@class="mod_table"]/tr/td[4]/text()') return city[1:-1], money[1:-1] (Bar().add_xaxis(get_city_money()[0]).add_yaxis( '价格', get_city_money()[1]).set_global_opts( title_opts=options.TitleOpts(title="各省房价"), visualmap_opts=options.VisualMapOpts(max_=15000, min_=5000), # 设置阈值 datazoom_opts=[options.DataZoomOpts()], # 拉的进度条 brush_opts=options.BrushOpts(), # 工具栏 yaxis_opts=options.AxisOpts(name="均价"), xaxis_opts=options.AxisOpts(name="城市"), ).render('房价.html'))
def kline_pro(kline: List[dict], fx: List[dict] = None, xd=None, bs: List[dict] = None, title: str = "缠中说禅K线分析", width: str = "1400px", height: str = '580px') -> Grid: """绘制缠中说禅K线分析结果 :param kline: K线 :param fx: 分型识别结果 :param bi: 笔识别结果 :param xd: 线段识别结果 :param zs: 中枢 :param bs: 买卖点 :param title: 图表标题 :param width: 图表宽度 :param height: 图表高度 :return: 用Grid组合好的图表 """ # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ bg_color = "#1f212d" # 背景 up_color = "#F9293E" down_color = "#00aa3b" init_opts = opts.InitOpts(bg_color=bg_color, width=width, height=height, animation_opts=opts.AnimationOpts(False)) title_opts = opts.TitleOpts( title=title, pos_top="1%", title_textstyle_opts=opts.TextStyleOpts(color=up_color, font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color=down_color, font_size=12)) label_not_show_opts = opts.LabelOpts(is_show=False) legend_not_show_opts = opts.LegendOpts(is_show=False) red_item_style = opts.ItemStyleOpts(color=up_color) green_item_style = opts.ItemStyleOpts(color=down_color) k_style_opts = opts.ItemStyleOpts(color=up_color, color0=down_color, border_color=up_color, border_color0=down_color, opacity=0.8) legend_opts = opts.LegendOpts(is_show=True, pos_top="1%", pos_left="30%", item_width=14, item_height=8, textstyle_opts=opts.TextStyleOpts( font_size=12, color="#0e99e2")) brush_opts = opts.BrushOpts(tool_box=["rect", "polygon", "keep", "clear"], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX") axis_pointer_opts = opts.AxisPointerOpts(is_show=True, link=[{ "xAxisIndex": "all" }]) range_start = int(100 - 216 / len(kline) * 100) dz_inside = opts.DataZoomOpts(False, "inside", xaxis_index=[0, 1, 2], range_start=range_start, range_end=100) dz_slider = opts.DataZoomOpts(True, "slider", xaxis_index=[0, 1, 2], pos_top="96%", pos_bottom="0%", range_start=range_start, range_end=100) yaxis_opts = opts.AxisOpts(is_scale=True, axislabel_opts=opts.LabelOpts( color="#c7c7c7", font_size=8, position="inside")) grid0_xaxis_opts = opts.AxisOpts( type_="category", grid_index=0, axislabel_opts=label_not_show_opts, split_number=20, min_="dataMin", max_="dataMax", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False)) tool_tip_opts = opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", position=JsCode(""" function (pos, params, el, elRect, size) { var obj = {top: 10}; obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30; return obj; } """), textstyle_opts=opts.TextStyleOpts(color="#000"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ # dts = [x.get('dt', x['date']) for x in kline] try: dts = [x['date'] for x in kline] except: dts = [x['dt'] for x in kline] # k_data = [[x['open'], x['close'], x['low'], x['high']] for x in kline] k_data = [ opts.CandleStickItem( name=i, value=[x['open'], x['close'], x['low'], x['high']]) for i, x in enumerate(kline) ] vol = [] for i, row in enumerate(kline): item_style = red_item_style if row['close'] > row[ 'open'] else green_item_style bar = opts.BarItem(name=i, value=row['volume'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) close = np.array([x['close'] for x in kline], dtype=np.double) diff, dea, macd = MACD(close) ma5 = SMA(close, timeperiod=5) ma34 = SMA(close, timeperiod=34) ma55 = SMA(close, timeperiod=55) ma233 = SMA(close, timeperiod=233) macd_bar = [] for i, v in enumerate(macd.tolist()): item_style = red_item_style if v > 0 else green_item_style bar = opts.BarItem(name=i, value=round(v, 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd_bar.append(bar) diff = diff.round(4) dea = dea.round(4) # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) chart_k.add_yaxis(series_name="Kline", y_axis=k_data, itemstyle_opts=k_style_opts) chart_k.set_global_opts(legend_opts=legend_opts, datazoom_opts=[dz_inside, dz_slider], yaxis_opts=yaxis_opts, tooltip_opts=tool_tip_opts, axispointer_opts=axis_pointer_opts, brush_opts=brush_opts, title_opts=title_opts, xaxis_opts=grid0_xaxis_opts) if xd: index = 0 zs_colors = [ "yellow", "white", '#f034c1', "#7944b7", "#468b58", "#c17f2f", "#9EA0A1" ] data = [] temp_xd = xd while temp_xd: zs_color = zs_colors[index % len(zs_colors)] data = data + [ opts.MarkAreaItem( name='XD{}'.format(index), x=(x['xd_list'][0]['date'], x['xd_list'][-1]['date']), y=(x['ZG']['value'], x['ZD']['value']), label_opts=opts.LabelOpts(color=zs_color), itemstyle_opts=opts.ItemStyleOpts( color=zs_color, opacity=0.2, )) for x in temp_xd.zs_list ] temp_xd = temp_xd.next index = index + 1 chart_k.set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True, data=data)) # 均线图 # ------------------------------------------------------------------------------------------------------------------ chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) ma_keys = {"MA5": ma5, "MA34": ma34, "MA55": ma55, "MA233": ma233} ma_colors = ["#39afe6", "#da6ee8", "#A02128", "#00940b"] for i, (name, ma) in enumerate(ma_keys.items()): chart_ma.add_yaxis(series_name=name, y_axis=ma, is_smooth=True, is_selected=False, symbol_size=0, label_opts=label_not_show_opts, linestyle_opts=opts.LineStyleOpts( opacity=0.8, width=1.0, color=ma_colors[i])) chart_ma.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_ma) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ if fx: try: fx_dts = [x['date'] for x in fx] except: fx_dts = [x['dt'] for x in fx] fx_val = [x['value'] for x in fx] chart_fx = Scatter() chart_fx.add_xaxis(fx_dts) chart_fx.add_yaxis(series_name="FX", y_axis=fx_val, is_selected=False, symbol="circle", symbol_size=6, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts( color="rgba(152, 147, 193, 1.0)", )) chart_fx.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_fx) if xd: index = 0 xd_colors = zs_colors while xd: xd_dts = [x['date'] for x in xd] xd_val = [x['value'] for x in xd] chart_xd = Line() chart_xd.add_xaxis(xd_dts) xd_color = xd_colors[index % len(xd_colors)] chart_xd.add_yaxis( series_name="XD{}".format(index), y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10, linestyle_opts=opts.LineStyleOpts(color=xd_color, width=index + 1, type_="solid"), itemstyle_opts=opts.ItemStyleOpts(color=xd_color)) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_xd) xd = xd.next index = index + 1 if bs: b_dts = [x['date'] for x in bs if x['bs'] == 'buy'] if len(b_dts) > 0: b_val = [x['value'] for x in bs if x['bs'] == 'buy'] chart_b = Scatter() chart_b.add_xaxis(b_dts) chart_b.add_yaxis(series_name="BUY", y_axis=b_val, is_selected=False, symbol="arrow", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts( color="#f31e1e", )) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_b) s_dts = [x['date'] for x in bs if x['bs'] == 'sell'] if len(s_dts) > 0: s_val = [x['value'] for x in bs if x['bs'] == 'sell'] chart_s = Scatter() chart_s.add_xaxis(s_dts) chart_s.add_yaxis(series_name="SELL", y_axis=s_val, is_selected=False, symbol="pin", symbol_size=12, itemstyle_opts=opts.ItemStyleOpts( color="#45b97d", )) chart_s.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_s) # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) chart_vol.add_yaxis(series_name="Volume", y_axis=vol, bar_width='60%') chart_vol.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=True, font_size=8, color="#9b9da9"), ), yaxis_opts=yaxis_opts, legend_opts=legend_not_show_opts, ) # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) chart_macd.add_yaxis(series_name="MACD", y_axis=macd_bar, bar_width='60%') chart_macd.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, color="#c7c7c7"), ), legend_opts=opts.LegendOpts(is_show=False), ) line = Line() line.add_xaxis(dts) line.add_yaxis(series_name="DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#da6ee8")) line.add_yaxis(series_name="DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#39afe6")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="86%", height="10%") grid_chart = Grid(init_opts) grid_chart.add(chart_k, grid_opts=grid0_opts) grid_chart.add(chart_vol, grid_opts=grid1_opts) grid_chart.add(chart_macd, grid_opts=grid2_opts) return grid_chart
def draw_kline(chart_data): # [open, close, lowest, highest] kline_data = [data[1:-1] for data in chart_data["values"]] markpoint_item = [ opts.MarkPointItem(name="AI", coord=coord, value=value, symbol='pin', symbol_size=[35, 20], itemstyle_opts=opts.ItemStyleOpts(color='rgb(255,0,0)')) for coord, value in zip(chart_data["ai_markpoint_coord"], chart_data["ai_markpoint_value"]) # ] ] + \ [ opts.MarkPointItem(name="每日周線談整突破", coord=coord, value=value, symbol='pin', symbol_size=[35, 20], itemstyle_opts=opts.ItemStyleOpts(color='rgb(0,255,0)')) for coord, value in zip(chart_data["other1_markpoint_coord"], chart_data["other1_markpoint_value"]) ] + \ [ opts.MarkPointItem(name="每日日線", coord=coord, value=value, symbol='pin', symbol_size=[35, 20], itemstyle_opts=opts.ItemStyleOpts(color='rgb(0,0,255)')) for coord, value in zip(chart_data["other2_markpoint_coord"], chart_data["other2_markpoint_value"]) ] + \ [ opts.MarkPointItem(name="每日日線盤整突破", coord=coord, value=value, symbol='pin', symbol_size=[35, 20], itemstyle_opts=opts.ItemStyleOpts(color='rgb(255,255,0)')) for coord, value in zip(chart_data["other3_markpoint_coord"], chart_data["other3_markpoint_value"]) ] + \ [ opts.MarkPointItem(name="每日日線布林條件", coord=coord, value=value, symbol='pin', symbol_size=[35, 20], itemstyle_opts=opts.ItemStyleOpts(color='rgb(0,255,255)')) for coord, value in zip(chart_data["other4_markpoint_coord"], chart_data["other4_markpoint_value"]) ] kline = (Kline().add_xaxis( xaxis_data=chart_data["categoryData"]).add_yaxis( series_name="Dow-Jones index", y_axis=kline_data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), markpoint_opts=opts.MarkPointOpts(data=markpoint_item), ).set_global_opts( legend_opts=opts.LegendOpts(is_show=False, pos_bottom=10, pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 1], range_start=98, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], type_="slider", pos_top="85%", range_start=98, range_end=100, ), ], yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, 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": "#00da3c" }, { "value": -1, "color": "#ec0000" }, ], ), 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=chart_data["categoryData"]).add_yaxis( series_name="MA5", y_axis=calculate_ma(day_count=5, data=chart_data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA10", y_axis=calculate_ma(day_count=10, data=chart_data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA20", y_axis=calculate_ma(day_count=20, data=chart_data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA30", y_axis=calculate_ma(day_count=30, data=chart_data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) bar = (Bar().add_xaxis(xaxis_data=chart_data["categoryData"]).add_yaxis( series_name="Volume", y_axis=chart_data["volumes"], 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 overlap_kline_line = kline.overlap(line) # Grid Overlap + Bar grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="800px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( overlap_kline_line, 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%"), ) return grid_chart.render_embed()