def bar_histogram_color() -> Bar: x = Faker.dogs + Faker.animal xlen = len(x) y = [] for idx, item in enumerate(x): if idx <= xlen / 2: y.append( opts.BarItem( name=item, value=(idx + 1) * 10, itemstyle_opts=opts.ItemStyleOpts(color="#749f83"), )) else: y.append( opts.BarItem( name=item, value=(xlen + 1 - idx) * 10, itemstyle_opts=opts.ItemStyleOpts(color="#d48265"), )) c = (Bar().add_xaxis(x).add_yaxis( "series0", y, category_gap=0, color=Faker.rand_color()).set_global_opts(title_opts=opts.TitleOpts( title="Bar-直方图(颜色区分)"))) return c
def bar_histogram(): x = Faker.dogs + Faker.animal xlen = len(x) y = [] for idx, item in enumerate(x): if idx <= xlen / 2: bar_item = opts.BarItem( name=item, value=(idx + 1) * 10, itemstyle_opts=opts.ItemStyleOpts(color="#749f83") ) else: bar_item = opts.BarItem( name=item, value=(xlen + 1 - idx) * 10, itemstyle_opts=opts.ItemStyleOpts(color="#d48265"), ) y.append(bar_item) obj_bar = Bar() obj_bar.add_xaxis(x) #直方图就是紧挨着的系列柱category_gap=0调节系列柱之间距离, # color=Faker.rand_color()因为上面设置了柱的颜色,这里只对图例legend的颜色起作用 obj_bar.add_yaxis("series0", y, category_gap=0,color=Faker.rand_color()) obj_bar.set_global_opts( title_opts=opts.TitleOpts(title="Bar-直方图(颜色区分)", subtitle="副标题") ) return obj_bar
def draw_bar_like(data,user_id,title="偏爱曲风统计"): """ 柱状图 偏爱统计 :param data: :param user_id: :param title: :return: """ file_name = "user_data/" + str(user_id) + "_bar_like.html" x = ["古风", "古典", "电子", "民谣", "流行", "说唱", "摇滚"] color = ["#C43C3C", "#7D573E", "#E6E65D", "#69DA69", "#70D4D4", "#9B7CC7", "#A2A2A2"] xlen = len(x) y = [] for idx, item in enumerate(x): y.append( opts.BarItem( name=item, value=data[idx][1], itemstyle_opts=opts.ItemStyleOpts(color=color[idx]), ) ) c = ( Bar() .add_xaxis(x) .add_yaxis("", y, color=Faker.rand_color()) .set_global_opts(title_opts=opts.TitleOpts(title=title), toolbox_opts=opts.ToolboxOpts() ) #.render(file_name) ) return c
def get_XY(bins, pct, label, color): # 分箱获取Y轴的数据 result = pd.cut(pct, bins, ordered=True, labels=label) v = pd.value_counts(result) result_dict = {} for i in label: if i == "-90": j = '-20+' else: j = i result_dict[j] = v.loc[i] gte_20 = pct[pct >= 20].count() result_dict.update({'20+': gte_20}) y_list = [] for k, v in result_dict.items(): if k.startswith('-'): color_ = color[0] else: color_ = color[1] y_list.append( opts.BarItem( name=str(v), value=int(v), itemstyle_opts=opts.ItemStyleOpts(color=color_), )) return result_dict, y_list
def charts(): fp = open('./oldData.txt', 'r') # Timeline timeline = Timeline(init_opts=opts.InitOpts( width="1660px", height="708px", )) # 48 bar charts for i in range(48): X, Y, Color = getSta(fp) # y-axle with color y = [] for j in range(22): y.append( opts.BarItem( name=X[j], value=Y[j], itemstyle_opts=opts.ItemStyleOpts(color=Color[j]))) # single bar chart bar = ( Bar().add_xaxis(X).add_yaxis( "Youbike 使用率", y).reversal_axis().set_global_opts( title_opts=opts.TitleOpts( title="南港區Youbike的一天", pos_left="center", ), legend_opts=opts.LegendOpts(pos_left="left"), graphic_opts=[ opts.GraphicGroup( # add a block graphic_item=opts.GraphicItem(left="80%", top="80%"), children=[ opts.GraphicText( # add text into the block graphic_item=opts.GraphicItem( left="center", top="center", # z=100 ), graphic_textstyle_opts=opts. GraphicTextStyleOpts( text="{}".format(invTime[i]), font="48px Verdana", ), ) ]) ]).set_series_opts( # number showed at right of the bar label_opts=opts.LabelOpts(position="right", color="#333"))) timeline.add(bar, "") # add single bar chart into timeline timeline.add_schema(play_interval=1000, is_loop_play=True) # play settings # export into HTML timeline.render("YoubikeUsingRate.html") fp.close()
def draw_bar_plays(data,user_id,title="听歌方式"): """ 两种听歌方式 :param plays: :param user_id: :param title: :return: """ file_name = "user_data/" + str(user_id) + "_bar_plays.html" x = ["片段播放", "完整播放"] color = ["#749f83", "#d48265"] xlen = len(x) y = [] for idx, item in enumerate(x): y.append( opts.BarItem( name=item, value=data[idx], itemstyle_opts=opts.ItemStyleOpts(color=color[idx]), ) ) c = ( Bar() .add_xaxis(x) .add_yaxis("用户:"+str(user_id), y,color=Faker.rand_color()) .set_global_opts(title_opts=opts.TitleOpts(title=title),toolbox_opts=opts.ToolboxOpts()) #.render(file_name) ) return c
def draw_bar_recoder(data,user_id,title = "用户行为统计"): """ 用户行为统计 :param data: :param user_id: :param title: :return: """ file_name = "user_data/" + str(user_id) + "_bar_recoder.html" x = ["循环播放","片段播放","查看评论","点赞评论","收藏歌曲"] color = ["#F79709","#749f83", "#d48265","#33CCCC","#82C182"] xlen = len(x) y = [] for idx, item in enumerate(x): y.append( opts.BarItem( name=item, value=data[idx][1], itemstyle_opts=opts.ItemStyleOpts(color=color[idx]), ) ) c = ( Bar() .add_xaxis(x) .add_yaxis("" , y, color=Faker.rand_color()) .set_global_opts(title_opts=opts.TitleOpts(title=title), toolbox_opts=opts.ToolboxOpts() ) # .render(file_name) ) return c
def test_bar_item_base(fake_writer): x_axis = ["A", "B", "C"] bar_item_1 = [ opts.BarItem(name=d[0], value=d[1]) for d in list(zip(x_axis, [1, 2, 3])) ] bar_item_2 = [ opts.BarItem(name=d[0], value=d[1]) for d in list(zip(x_axis, [4, 5, 6])) ] c = (Bar().add_xaxis(x_axis).add_yaxis("series0", bar_item_1).add_yaxis( "series1", bar_item_2)) c.render() _, content = fake_writer.call_args[0] assert_greater(len(content), 2000) assert_equal(c.theme, "white") assert_equal(c.renderer, "canvas")
def draw_degree(): degree = nx.degree(G) degree_sort = sorted(degree, key=lambda x: x[1], reverse=True) e0 = [ opts.BarItem(name=G.nodes[degree_sort[0][0]], value=degree_sort[0][1]) ] e1 = [ opts.BarItem(name=G.nodes[x[0]]['name'], value=x[1]) for x in degree_sort if G.nodes[x[0]]['E_numbers'] == 1 ][:50] e2 = [ opts.BarItem(name=G.nodes[x[0]]['name'], value=x[1]) for x in degree_sort if G.nodes[x[0]]['E_numbers'] == 2 ][:50] xaxis = [x + 1 for x in range(50)] c = (Bar().add_xaxis(xaxis).add_yaxis( "Erdos_number is 0", e0, category_gap=0, itemstyle_opts=opts.ItemStyleOpts(color='#d48265'), gap="0%").add_yaxis( "Erdos_number is 1", e1, category_gap=0, itemstyle_opts=opts.ItemStyleOpts(color='#749f83'), gap="0%").add_yaxis( "Erdos_number is 2", e2, category_gap=0, gap="0%").set_series_opts( label_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisOpts(interval=1), markline_opts=opts.MarkLineOpts(data=[ opts.MarkLineItem(type_="average", name="Average"), ]), ).set_global_opts( title_opts=opts.TitleOpts(title="Top 50 degree authors"), datazoom_opts=opts.DataZoomOpts(), yaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), ).render("bar_stack1.html"))
def format_yaxis(self, y_set, offset=0, sign=1, opacity: float = 1): while len(self.y_axiss) < len(y_set) + offset: self.y_axiss.append([]) for idx, item in enumerate(y_set.items()): country, value = item color = self.get_country_color(country) self.y_axiss[idx + offset].append( opts.BarItem(name=country, value=value * sign, itemstyle_opts=opts.ItemStyleOpts( color=color, opacity=opacity)))
def dsp_her(): # 显示遗传力 # page = Page(layout=Page.DraggablePageLayout) import xlrd # file = "breeding.xlsx" f1 = xlrd.open_workbook(file) sheet1 = f1.sheet_by_name('Sheet1') lst = her(file) # 接收计算的遗传力 y = [] colorArr = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ] for i in range(len(lst)): color = "#" for j in range(6): color += colorArr[random.randint(0, 14)] y.append( opts.BarItem( value=lst[i], itemstyle_opts=opts.ItemStyleOpts(color=str(color)), # itemstyle_opts=opts.ItemStyleOpts(color=color[i]) )) x_ax = [] y_ax = [] start = load_profile()[0] end = load_profile()[1] for i in range(start, end + 1): x_ax.append(sheet1.cell_value(0, i)) bar = Bar(init_opts=opts.InitOpts( #bg_color='rgba(155,250,205,0.2)', width="1800px", height="800px")) bar.set_colors(["#FF6347", "black"]) # FF6347 bar.add_xaxis(x_ax) bar.add_yaxis("遗传力", y, category_gap="60%") bar.set_series_opts( label_opts=opts.LabelOpts(is_show=False), markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(type_="max", name="最大值")])) # bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49]) bar.set_global_opts(title_opts=opts.TitleOpts(title="显示已有数据遗传力")) for i in range(sheet1.nrows - 1): y_ax.append(i) line = Line(init_opts=opts.InitOpts(width="1800px", height="800px")) line.add_xaxis(y_ax) line.add_yaxis(series_name="", y_axis=lst, label_opts=opts.LabelOpts(is_show=True)) picture = bar.overlap(line) return render_template("display.html", picture_options=picture.dump_options())
def select_data(year): film_list = select_film(year) colors = [ "#546570", "#c4ccd3", "#bda29a", "#ca8622", "#d48265", "#6e7074", "#749f83", "#61a0a8", "#2f4554", "#c23531", "#6e7074", "#749f83", "#61a0a8", "#2f4554", "#c23531" ] y = [] for n in range(len(film_list[1])): y.append( opts.BarItem( name=film_list[0][n], value=film_list[1][n], itemstyle_opts=opts.ItemStyleOpts(color=colors[n]), )) return y
def dsp_cbv(): # 显示综合育种值 import xlrd # file = "breeding.xlsx" f1 = xlrd.open_workbook(file) sheet1 = f1.sheet_by_name('Sheet1') lst = cbv(file)[0] # 接收计算的早选指数 y = [] colorArr = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ] for i in range(len(lst)): color = "#" for j in range(6): color += colorArr[random.randint(0, 14)] y.append( opts.BarItem( value=lst[i], itemstyle_opts=opts.ItemStyleOpts(color=str(color)), # itemstyle_opts=opts.ItemStyleOpts(color=color[i]) )) x_ax = cbv(file)[1] # y_ax = [] bar = Bar(init_opts=opts.InitOpts( #bg_color='rgba(255,250,205,0.2)', width="1800px", height="800px")) bar.set_colors(["#FF6347", "black"]) bar.add_xaxis(x_ax) bar.add_yaxis("综合育种值", y, category_gap="80%") bar.set_series_opts( label_opts=opts.LabelOpts(is_show=False), markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(type_="max", name="最大值")])) # bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49]) bar.set_global_opts(title_opts=opts.TitleOpts(title="显示已有数据综合育种值")) # for i in range(sheet1.nrows-1): # y_ax.append(i) # line = Line(init_opts=opts.InitOpts(width="1800px", height="800px")) # line.add_xaxis(y_ax) # line.add_yaxis(series_name="", y_axis=lst, label_opts=opts.LabelOpts(is_show=True)) picture = bar return render_template("display.html", picture_options=picture.dump_options())
def change_data(dataframe): global date_list, price_list, ma5_list, ma10_list, ma20_list, volume_list # 转成列表 try: for i in range(0, len(dataframe)): alist = [] date_list.append(dataframe['date'].iloc[i]) # alist.append(tsData['date'].iloc[i]) alist.append(dataframe['open'].iloc[i]) alist.append(dataframe['close'].iloc[i]) alist.append(dataframe['low'].iloc[i]) alist.append(dataframe['high'].iloc[i]) ma5_list.append(dataframe['ma5'].iloc[i]) ma10_list.append(dataframe['ma10'].iloc[i]) ma20_list.append(dataframe['ma20'].iloc[i]) high_list.append(dataframe['high'].iloc[i]) low_list.append(dataframe['low'].iloc[i]) # 柱状图数据处理 color = '' if dataframe['open'].iloc[i] > dataframe['close'].iloc[i]: color = '#ADFF2F' else: color = '#FF4500' volume_list.append( opts.BarItem(name='volume', value=dataframe['volume'].iloc[i], itemstyle_opts=opts.ItemStyleOpts(color=color))) price_list.append(alist) print('股票数据已成功转换') except: print('股票数据转换失败!') draw()
def find_aggregation_render(x, y, flag, query, table_path, answer, y_name): colorList = ['#f36c6c', '#e6cf4e', '#20d180', '#0093ff'] x_sum = ["Sum"] Sum = [] Sum.append(sum(y)) mean = np.mean(y) y1 = [] y2 = [] for i in range(len(y)): if y[i] >= mean: y1.append(round(mean, 2)) y2.append( opts.BarItem(name=x[i], value=round(y[i] - mean, 2), label_opts=opts.LabelOpts(formatter="+{c}"), itemstyle_opts=opts.ItemStyleOpts(color="red"))) else: y1.append(round(y[i], 2)) y2.append( opts.BarItem(name=x[i], value=round(mean - y[i], 2), label_opts=opts.LabelOpts(formatter="-{c}"), itemstyle_opts=opts.ItemStyleOpts(color="green", opacity=0.3))) if flag == "mean": bar = Bar() bar.add_xaxis(x) bar.add_yaxis( '', y_axis=y1, stack='stack1', label_opts=opts.LabelOpts(is_show=False), color="white", markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(name="mean:", y=round(mean, 2))], label_opts=opts.LabelOpts(formatter="Mean:{c}", color="black"), linestyle_opts=opts.LineStyleOpts(color="gray")), ) bar.add_yaxis('', y_axis=y2, stack='stack1') bar.set_global_opts( datazoom_opts=[ opts.DataZoomOpts(range_start=10, range_end=90), opts.DataZoomOpts(type_="inside") ], xaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(rotate=40, font_size='100%'), name_textstyle_opts=opts.TextStyleOpts(font_size="100%")), yaxis_opts=opts.AxisOpts( min_=int(min(y) - (max(y) - min(y)) / 10), name=y_name, axislabel_opts=opts.LabelOpts(font_size="100%"), name_textstyle_opts=opts.TextStyleOpts(font_size="100%")), graphic_opts=[ opts.GraphicText( graphic_item=opts.GraphicItem( left="center", top="bottom", ), graphic_textstyle_opts=opts.GraphicTextStyleOpts( # 可以通过jsCode添加js代码,也可以直接用字符串 text=[ '\n' + "Q:" + ' ' + query + '\n' + "\n" + 'A:' + ' ' + answer ], font="14px Microsoft YaHei", graphic_basicstyle_opts=opts.GraphicBasicStyleOpts( fill="#333"))) ]) bar.render("aggregation.html") grid = Grid(init_opts=opts.InitOpts( width="100%", height="100%", renderer=globals.RenderType.SVG, )) grid.add(bar, grid_opts={'left': '15%', 'bottom': '34%'}) grid1 = Grid() grid1.add(bar, grid_opts={'left': '15%', 'bottom': '34%'}) grid1.render("mean.html") option1 = grid.dump_options_with_quotes() option1 = json.loads(option1) option = {"option": [option1], "query": query} return option elif flag == "sum": bar = Bar() bar.add_xaxis(x_sum) bar.add_yaxis('', Sum, label_opts=opts.LabelOpts(position="inside", formatter="Sum:{c}"), color=colorList[0]) for i in range(len(y)): Y = [] Y.append(y[i]) r = str(x[i]) bar.add_yaxis('', Y, stack='stack1', label_opts=opts.LabelOpts(position="inside", formatter=r + ":{c}"), tooltip_opts=opts.TooltipOpts(is_show=False)) bar.set_global_opts( datazoom_opts=[ opts.DataZoomOpts(range_start=10, range_end=90, orient="vertical"), opts.DataZoomOpts(type_="inside") ], graphic_opts=[ opts.GraphicText( graphic_item=opts.GraphicItem( left="center", top="bottom", ), graphic_textstyle_opts=opts.GraphicTextStyleOpts( # 可以通过jsCode添加js代码,也可以直接用字符串 text=[ '\n' + "Q:" + ' ' + query + '\n' + 'A:' + ' ' + answer ], font="14px Microsoft YaHei", graphic_basicstyle_opts=opts.GraphicBasicStyleOpts( fill="#333"))) ]) grid = Grid(init_opts=opts.InitOpts( width="100%", height="100%", renderer=globals.RenderType.SVG, )) grid.add(bar, grid_opts={'left': '15%', 'bottom': '34%'}) option1 = grid.dump_options_with_quotes() option1 = json.loads(option1) option = {"option": [option1], "query": query} return option
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 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
def find_proportion_render(x, y, z, part_name, main_name, query, table_path, answer): x = list(map(str, x)) y = list(map(float, y)) z = list(map(float, z)) colorList = ['#f36c6c', '#e6cf4e', '#20d180', '#0093ff'] y_part = [] y_main = [] for i in range(len(y)): percentage = y[i] / z[i] * 100 percentage = str(percentage).split('.')[0] + '.' + str( percentage).split('.')[1][:2] y_part.append( opts.BarItem( name=x[i], value=y[i], label_opts=opts.LabelOpts(position="insideTop", formatter=str(percentage) + "%"), itemstyle_opts=opts.ItemStyleOpts(color=colorList[2]))) y_main.append(opts.BarItem( name=x[i], value=z[i] - y[i], )) bar = Bar() bar.add_xaxis(x) bar.add_yaxis('', y_axis=y_part, stack='stack1', label_opts=opts.LabelOpts(position="insideTop"), itemstyle_opts=opts.ItemStyleOpts(color=colorList[2]), tooltip_opts=opts.TooltipOpts(formatter=part_name + ':{c}')), bar.add_yaxis('', y_axis=y_main, stack='stack1', label_opts=opts.LabelOpts(is_show=False), color="gray", tooltip_opts=opts.TooltipOpts(formatter=main_name + ':{c}')) bar.set_global_opts( datazoom_opts=[ opts.DataZoomOpts(range_start=10, range_end=90), opts.DataZoomOpts(type_="inside") ], legend_opts=opts.LegendOpts(is_show=False), graphic_opts=[ opts.GraphicText( graphic_item=opts.GraphicItem( left="center", top="bottom", ), graphic_textstyle_opts=opts.GraphicTextStyleOpts( # 可以通过jsCode添加js代码,也可以直接用字符串 text=[ '\n' + "Q:" + ' ' + query + '\n' + 'A:' + ' ' + answer ], font="14px Microsoft YaHei", graphic_basicstyle_opts=opts.GraphicBasicStyleOpts( fill="#333"))) ]) bar.render("aggregation.html") grid = Grid(init_opts=opts.InitOpts( width="100%", height="100%", renderer=globals.RenderType.SVG, )) grid.add(bar, grid_opts={'left': '20%', 'bottom': '34%'}) option1 = grid.dump_options_with_quotes() option1 = json.loads(option1) option = {"option": [option1], "query": query} return option
# 直方图 import random import pyecharts.options as opts from pyecharts.charts import Bar x_vals = ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'] xlen = len(x_vals) # 设置成两种颜色 y_vals = [] for idx, item in enumerate(x_vals): if idx % 2 == 0: y_vals.append( opts.BarItem( name=item, value=random.randint(10, 100), itemstyle_opts=opts.ItemStyleOpts(color="#749f83"), )) else: y_vals.append( opts.BarItem( name=item, value=random.randint(10, 100), itemstyle_opts=opts.ItemStyleOpts(color="#d48265"), )) bar_histogram = ( Bar().add_xaxis(x_vals).add_yaxis('商家A', y_vals, category_gap=0) # .add_yaxis('商家A', [random.randint(10, 100) for _ in range(6)], category_gap=0) .set_series_opts( label_opts=opts.LabelOpts(is_show=True, font_size=14)).set_global_opts(
def salary_pie_chart(self): """薪酬分布""" salary_xaxis = [ '0', '5000', '10000', '15000', '20000', '30000', '40000', '50000', '60000', '70000', '80000', '90000', '100000' ] salary_yaxis = [] kd = self.frame.salary.value_counts() salary_dict = { 0: 0, 5000: 0, 10000: 0, 15000: 0, 20000: 0, 30000: 0, 40000: 0, 50000: 0, 60000: 0, 70000: 0, 80000: 0, 90000: 0, 100000: 0 } for k, v in dict(kd).items(): min_salary = float( k.split('-')[0].split('·')[0].replace( '以上', '').rstrip('k').rstrip('K')) * 1000 try: max_salary = float( k.split('-')[1].split('·')[0].replace( '以上', '').rstrip('k').rstrip('K')) * 1000 except: max_salary = min_salary salary = 0.5 * (min_salary + max_salary) if salary in range(0, 5000): salary = 0 if salary in range(5000, 10000): salary = 5000 if salary in range(10000, 15000): salary = 10000 if salary in range(15000, 20000): salary = 15000 if salary in range(20000, 30000): salary = 20000 if salary in range(30000, 40000): salary = 30000 if salary in range(40000, 50000): salary = 40000 if salary in range(50000, 60000): salary = 50000 if salary in range(60000, 70000): salary = 60000 if salary in range(70000, 80000): salary = 70000 if salary in range(80000, 90000): salary = 80000 if salary in range(90000, 100000): salary = 90000 if salary in range(100000, 10000000000): salary = 100000 if salary_dict.get(salary, ''): salary_dict[salary] = salary_dict[salary] + v else: salary_dict[salary] = v salary_dict = dict(collections.OrderedDict(sorted( salary_dict.items()))) for salary_key, salary_value in salary_dict.items(): salary_yaxis.append( opts.BarItem( name=str(salary_key), value=int(salary_value), itemstyle_opts=opts.ItemStyleOpts(color="#d48265"), )) html_path = os.path.join( create_or_get_directory(os.path.join('report', 'single')), 'salary_pie_chart.html') c = (Bar(init_opts=opts.InitOpts( width="60%")).add_xaxis(salary_xaxis).add_yaxis( "", salary_yaxis, category_gap=-1).set_series_opts( label_opts=opts.LabelOpts(is_show=False)).set_global_opts( yaxis_opts=opts.AxisOpts( name="岗位数量", axislabel_opts=opts.LabelOpts(color='red'), name_textstyle_opts=opts.TextStyleOpts( color='#d48265')), xaxis_opts=opts.AxisOpts( name="薪酬", axislabel_opts=opts.LabelOpts(color='red'), name_textstyle_opts=opts.TextStyleOpts( color='#d48265')), tooltip_opts=opts.TooltipOpts( trigger="item", formatter=JsCode("""function (params) { var name=''; if (params.name < 5000){ name='小于5K' } else if (params.name < 10000) { name='5K-10K' } else if (params.name < 15000) { name='10K-15K' } else if (params.name < 20000) { name='15K-20K' } else if (params.name < 30000) { name='20K-30K' } else if (params.name < 40000) { name='30K-40K' } else if (params.name < 50000) { name='40K-50K' } else if (params.name < 60000) { name='50K-60K' } else if (params.name < 70000) { name='60K-70K' } else if (params.name < 80000) { name='70K-80K' } else if (params.name < 90000) { name='80K-90K' } else if (params.name < 100000) { name='90K-100K' } else { name='大于100K' } return name+':'+params.value; } """)), ).render(html_path)) script_string = self.get_javascript_string(html_path) self.set_report_javascript(script_string, 'salary_pie_chart') self.middle_charts.append({ 'title': '薪资分布', 'name': 'salary_pie_chart' })
) # map.render('全球温度地图.html') print("全球温度地图已生成!!") # 绘制最高温度前十位国家的平均温度情况(条形图) # print(top_ten_country) country = [x[0] for x in top_ten_country] # 前十个国家 temperature = [x[1] for x in top_ten_country] # 前十个国家对应温度 x = [] # 空列表存温度 color_series = randomcolor(len(country)) for i in range(10): x.append( opts.BarItem( name=country[i], value=round(temperature[i], 2), itemstyle_opts=opts.ItemStyleOpts( color=color_series[i]) # 设置每根柱子的颜色 )) # 绘制柱形图 bar = Bar() bar.add_xaxis(country) bar.add_yaxis(series_name='温度', y_axis=x, is_selected=True, label_opts=opts.LabelOpts(is_show=True)) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='right')) bar.set_global_opts( title_opts=opts.TitleOpts(title="排行榜前十名温度最高国家"), tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="shadow"),
def to_grid(ka, kline_mode: str = "new", with_bi: bool = False, with_xd: bool = False, with_zs: bool = False, with_bs: bool = False, with_ma: bool = False, with_vol: bool = False, with_macd: bool = False, title: str = "ChanLun In Practise", width: str = "1440px", height: str = '900px') -> Grid: """绘制缠中说禅K线分析结果 :param kline: K线 new / raw,new标识标准化后的k线,raw标识原始k线 :param with_bi: 是否显示笔识别结果,默认True,不输出False :param with_xd: 是否显示线段识别结果 :param with_zs: 是否显示中枢识别结果 :param with_bs: 是否显示买卖点 :param with_ma: 是否显示均线,默认True,不输出False :param with_macd: 是否显示macd,默认True,不输出False :param with_vol: 是否显示成交量,默认True,不输出False :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='1400px', height='800px') 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", textstyle_opts=opts.TextStyleOpts(color="#000"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ kline = ka.kline_new if kline_mode == 'new' else ka.kline_raw dts = [x['dt'] for x in kline] k_data = [[x['open'], x['close'], x['low'], x['high']] for x in kline] # seriesname aggregation = len(ka.ka_list)>0 # {'freq': {'kline', 'ma', 'vol', 'macd'}} agg_dict = {} agg_dict[ka.freq] = { "kline": k_data, "ma": ka.ma, "vol": kline, "macd": ka.macd } if aggregation: for high_ka in ka.ka_list: agg_dict[high_ka.freq] = {} _high_k_data = high_ka.kline_new if kline_mode == 'new' else high_ka.kline_raw high_k_data = [] high_ma_data = [] high_vol_data = [] high_macd_data = [] for i in range(len(dts)): high_k_data.append([]) high_ma_data.append({}) high_vol_data.append(None) high_macd_data.append(None) for ki in range(len(kline)): k = kline[ki] _start = 0 for h_ki in range(_start, len(_high_k_data)): h_k = _high_k_data[h_ki] if (h_k['dt'] == k['dt']): high_k_data[ki] = [h_k['open'], h_k['close'], h_k['low'], h_k['high']] high_ma_data[ki] = high_ka.ma[h_ki] high_vol_data[ki] = h_k high_macd_data[ki] = high_ka.macd[h_ki] _start = h_ki+1 break agg_dict[high_ka.freq] = { "kline": high_k_data, "ma": high_ma_data, "vol": high_vol_data, "macd": high_macd_data } # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) for k, v in agg_dict.items(): chart_k.add_yaxis(series_name=k if aggregation else 'kline', y_axis=v['kline'], itemstyle_opts=k_style_opts) is_selected = False 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 with_ma: # 均线图 # ------------------------------------------------------------------------------------------------------------------ ma_keys = [x for x in agg_dict[ka.freq]['ma'][0].keys() if "ma" in x][:3] ma_colors = ["#39afe6", "#da6ee8", "#00940b"] chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) for key, vals in agg_dict.items(): for i, k in enumerate(ma_keys): y_data = [x[k] if k in x else None for x in v['ma']] chart_ma.add_yaxis(series_name=key if aggregation else k.upper(), y_axis=y_data, is_smooth=True, is_selected=True, is_connect_nones=True, 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) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ def __draw_bi_line(_ka): bi_dts = [x['dt'] for x in _ka.bi_list] bi_val = [x['bi'] for x in _ka.bi_list] chart_bi = Line() chart_bi.add_xaxis(bi_dts) chart_bi.add_yaxis(series_name=_ka.freq if aggregation else "BI", y_axis=bi_val, is_selected=True, symbol="diamond", symbol_size=10, label_opts=label_not_show_opts,) chart_bi.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) return chart_bi if with_bi: chark_k = chart_k.overlap(__draw_bi_line(ka)) for _ka in ka.ka_list: chark_k = chart_k.overlap(__draw_bi_line(_ka)) def __draw_xd_line(_ka): xd_dts = [x['dt'] for x in _ka.xd_list] xd_val = [x['xd'] for x in _ka.xd_list] chart_xd = Line() chart_xd.add_xaxis(xd_dts) chart_xd.add_yaxis(series_name=_ka.freq if aggregation else "XD", y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10,) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) return chart_xd if with_xd: chark_k = chart_k.overlap(__draw_xd_line(ka)) for _ka in ka.ka_list: chark_k = chart_k.overlap(__draw_xd_line(_ka)) def __draw_zs_area(_ka): lines = [] scatters = [] for _zs in _ka.zs_list: x_start = _zs['start_point']['dt'] if _zs['zs_finished']:# 中枢完成 x_end = _zs['end_point']['dt'] chart_b = EffectScatter() if 'buy3' in _zs: chart_b.add_xaxis([_zs['buy3']['dt']]) chart_b.add_yaxis(series_name=_ka.freq if aggregation else "B", y_axis=[_zs['buy3']['xd']], is_selected=False, symbol="circle", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts(color="red",)) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) scatters.append(chart_b) elif 'sell3' in _zs: chart_b.add_xaxis([_zs['sell3']['dt']]) chart_b.add_yaxis(series_name=_ka.freq if aggregation else "S", y_axis=[_zs['sell3']['xd']], is_selected=False, symbol="circle", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts(color="green",)) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) scatters.append(chart_b) elif len(_zs['points'])>=5:# 中枢成立但未完成,有3笔或段以上 x_end = _zs['points'][-1]['dt'] else: # 中枢未完成,且未确定 continue ZD = _zs['ZD'] ZG = _zs['ZG'] area_data=[[ {'xAxis': x_start, 'yAxis': ZD, 'value': ZD }, {'xAxis': x_end, 'yAxis': ZG, 'value': ZG }]] line = (Line() .add_xaxis([x_start, x_end]) .add_yaxis(series_name=_ka.freq if aggregation else "ZS", y_axis=[ZD, ZG], symbol='none' """ , markpoint_opts = opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="ZG"), opts.MarkPointItem(type_="min", name="ZD"), ] ) """ , markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts( position="middle", color="blue", font_size=15, ), linestyle_opts=opts.LineStyleOpts(type_="dashed"), data=area_data, symbol=["none", "none"], ) ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(data=area_data, itemstyle_opts=opts.ItemStyleOpts(color="#dcdcdc",opacity=0.1)) )) lines.append(line) return lines, scatters if with_zs: _areas, _scatters = __draw_zs_area(ka) for _ka in ka.ka_list: _a, _s = __draw_zs_area(_ka) _areas.extend(_a) _scatters.extend(_s) for _area in _areas: chark_k = chart_k.overlap(_area) for _scatter in _scatters: chark_k = chart_k.overlap(_scatter) # if with_vol: # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) for k, v in agg_dict.items(): vol = [] for row in v['vol']: if not row: row = {'close': 0, 'open': 0, 'vol': 0} item_style = red_item_style if row['close'] > row['open'] else green_item_style bar = opts.BarItem(name=None, value=row['vol'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) chart_vol.add_yaxis(series_name=k if aggregation else "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, ) #if with_macd: # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) for k, v in agg_dict.items(): macd_bar = [] for row in v['macd']: if not row: row = {'macd': 0} item_style = red_item_style if row['macd'] > 0 else green_item_style bar = opts.BarItem(name=None, value=round(row['macd'], 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd_bar.append(bar) chart_macd.add_yaxis(series_name=k if aggregation else "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) for k, v in agg_dict.items(): macd = v['macd'] diff = [round(x['diff'], 4) if x else None for x in macd] dea = [round(x['dea'], 4) if x else None for x in macd] line.add_yaxis(series_name=k if aggregation else "DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False , is_connect_nones=True, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#EDCB89")) line.add_yaxis(series_name=k if aggregation else "DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False , is_connect_nones=True, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#FFFFFF")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="3%", 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
area = [x[0] for x in area_count] nums = [y[1] for y in area_count] # 使用风格 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS)) colors = [ 'red', '#0000CD', '#000000', '#008000', '#FF1493', '#FFD700', '#FF4500', '#00FA9A', '#191970', '#9932CC' ] random.shuffle(colors) # 配置y轴数据 Baritem y = [] for i in range(10): y.append( opts.BarItem( name=area[i], value=nums[i], itemstyle_opts=opts.ItemStyleOpts(color=colors[i]) # 设置每根柱子的颜色 )) bar.add_xaxis(xaxis_data=area) bar.add_yaxis("上榜美女数", y) bar.set_global_opts( xaxis_opts=opts.AxisOpts(name='国家', axislabel_opts=opts.LabelOpts(rotate=45)), yaxis_opts=opts.AxisOpts( name='上榜美女数', min_=0, max_=55, # y轴刻度的最小值 最大值 ), title_opts=opts.TitleOpts(title="各地区上榜美女数", title_textstyle_opts=opts.TextStyleOpts( font_family="KaiTi",
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
# -*- coding:utf-8 -*- from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Faker x = Faker.dogs + Faker.animal xlen = len(x) y = [] for idx, item in enumerate(x): if idx <= xlen / 2: y.append( opts.BarItem( name=item, value=(idx + 1) * 10, itemstyle_opts=opts.ItemStyleOpts(color="#749f83"), )) else: y.append( opts.BarItem( name=item, value=(xlen + 1 - idx) * 10, itemstyle_opts=opts.ItemStyleOpts(color="#d48265"), )) c = ( Bar().add_xaxis(x) #category_gap: 同一系列的柱间距离,默认为类目间距的 20%,可设固定值 .add_yaxis( "series0", y, category_gap=0, color=Faker.rand_color()).set_global_opts(title_opts=opts.TitleOpts(