def paint_bar(self, x: list, collects: list, title: str, mark_point: bool = False): bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) bar.add_xaxis(x) for collect in collects: for i, (name, unit, data) in enumerate(collect): bar.add_yaxis(f'{name}-单位:{unit}', data, yaxis_index=i) if i != 0: bar.extend_axis(yaxis=opts.AxisOpts( name='', type_='value', position='right', )) bar.set_global_opts(title_opts=opts.TitleOpts(title=title, pos_left='5%'), legend_opts=opts.LegendOpts(pos_bottom='0')) bar.set_series_opts( label_opts=opts.LabelOpts(position='top'), tooltip_opts=opts.TooltipOpts(formatter=f'{{b}}年{{a}}:{{c}}')) if mark_point: bar.set_series_opts( markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', name='最大值'), opts.MarkPointItem(type_='min', name='最小值') ], symbol_size=80)) return bar
def workhour_get(): p = WorkhourInfo() # 获取最近的12月 df = p.df.dropna()[-12:] xdata = df['月份'].tolist() # fig = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) fig = Bar() fig.add_xaxis(xdata) fig.add_yaxis('总投入', df['实际投入工时'].tolist(), label_opts=opts.LabelOpts(position='inside')) for v in df.columns[6:]: fig.add_yaxis(v, df[v].tolist(), stack='detail', is_selected=False, label_opts=opts.LabelOpts(is_show=False)) fig.set_global_opts( title_opts=opts.TitleOpts(title="最近12月工时投入"), tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="shadow"), yaxis_opts=opts.AxisOpts(name='工时'), ) #""" df['投入总工时比率'] = (df['投入总工时比率'] * 100).round(0) maxratio = df['投入总工时比率'].max() maxratio = 100 if maxratio <= 100 else maxratio ratio = df['投入总工时比率'].tolist() line = Line() line.add_xaxis(xdata) line.add_yaxis('投入工时率', ratio, yaxis_index=1) fig.extend_axis(yaxis=opts.AxisOpts(name="投入工时率", type_="value", min_=0, max_=maxratio, axislabel_opts=opts.LabelOpts( formatter="{value} %"))) fig.overlap(line) #""" return fig.dump_options_with_quotes()
def bar_chart(x, y1, y2) -> Bar(): c = Bar(init_opts=opts.InitOpts(width='1200px', height='800px')) c.add_xaxis(xaxis_data=x, ) # label_opts = opts.LabelOpts(is_show=False) 是否顯示數值 c.add_yaxis(series_name='', yaxis_data=y1, label_opts=opts.LabelOpts(is_show=True)) c.set_global_opts( title_opts=opts.TitleOpts(title=''), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)), datazoom_opts=opts.DataZoomOpts(type_='slider')) c.extend_axis(yaxis=opts.AxisOpts(name='觀看次數', type_='value', min_=min(y2), max_=max(y2), interval=500000, axislabel_opts=opts.LabelOpts( formatter='{value}次'))) return c
def paint_bar_stack_with_line(self, x: list, children: dict, parents: dict, sub_title: str): for (parent_name, unit), item in children.items(): bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS)) bar.add_xaxis(x) line = Line() line.add_xaxis(x) child_names = [] for child_name, data, overall in item: bar.add_yaxis(child_name, data, stack='stack1') line.add_yaxis(f'{child_name}占比', overall, yaxis_index=1) child_names.append(child_name) bar.add_yaxis(parent_name, parents[parent_name], stack='stack1', yaxis_index=0) bar.set_global_opts( title_opts=opts.TitleOpts(title=','.join(child_names), subtitle=sub_title, pos_left='5%'), legend_opts=opts.LegendOpts(pos_bottom='0')) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False), tooltip_opts=opts.TooltipOpts( formatter=f'{{b}}年{{a}}:{{c}}{unit}'), itemstyle_opts=opts.ItemStyleOpts(opacity=0.5)) bar.extend_axis(yaxis=opts.AxisOpts( type_='value', name='所占比例', min_=0, max_=1, position='right', splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts( opacity=1)))) bar.overlap(line) yield bar
def echarts_stackbar( df, # 传入数据df,应该是一个行索引为date的时间序列面板数据 df_gr=None, # 传入同比增长率df,可以没有 datatype="ABS", # 主Y轴形式是绝对值,增长率还是份额,用来确定一些标签格式,默认为绝对值 ) -> Bar: axislabel_format = "{value}" # 主Y轴默认格式 max = df[df > 0].sum(axis=1).max() # 主Y轴默认最大值 min = df[df <= 0].sum(axis=1).min() # 主Y轴默认最小值 if datatype in ["SHARE", "GR"]: # 如果主数据不是绝对值形式而是份额或增长率如何处理 df = df.multiply(100).round(2) axislabel_format = "{value}%" max = 100 min = 0 if df_gr is not None: df_gr = df_gr.multiply(100).round(2) # 如果有同比增长率,原始数*100呈现 if df.empty is False: stackbar = Bar().add_xaxis(df.index.tolist()) for i, item in enumerate(df.columns): # 预留的枚举,这个方法以后可以根据输入对象不同从单一柱状图变成堆积柱状图 stackbar.add_yaxis( item, df[item].values.tolist(), stack="总量", label_opts=opts.LabelOpts(is_show=False), z_level=1, ) # .add_yaxis(series_name=df.index[-5].strftime("%Y-%m"), # yaxis_data=df_ya.values.tolist(), # stack='总量', # label_opts=opts.LabelOpts(is_show=False) # ) # .add_yaxis(series_name=df.index[-1].strftime("%Y-%m")+' vs '+df.index[-5].strftime("%Y-%m"), # yaxis_data=df_diff.values.tolist(), # stack='总量', # label_opts=opts.LabelOpts(is_show=False) # ) if df_gr is not None: # 如果有同比增长率数据则加入次Y轴 stackbar.extend_axis( yaxis=opts.AxisOpts( name=df_gr.columns.astype("str")[0], type_="value", axislabel_opts=opts.LabelOpts(formatter="{value}%"), ) ) stackbar.set_global_opts( legend_opts=opts.LegendOpts(pos_top="5%", pos_left="10%", pos_right="60%"), # toolbox_opts=opts.ToolboxOpts(is_show=True), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross",), xaxis_opts=opts.AxisOpts( type_="category", boundary_gap=True, axislabel_opts=opts.LabelOpts(rotate=90), # x轴标签方向rotate有时能解决拥挤显示不全的问题 splitline_opts=opts.SplitLineOpts( is_show=False, linestyle_opts=opts.LineStyleOpts(type_="dotted", opacity=0.5,), ), ), yaxis_opts=opts.AxisOpts( max_=max, min_=min, type_="value", axislabel_opts=opts.LabelOpts(formatter=axislabel_format), # axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(type_="dotted", opacity=0.5,), ), ), ) if df_gr is not None: line = ( Line() .add_xaxis(xaxis_data=df_gr.index.tolist()) .add_yaxis( series_name=df_gr.columns.astype("str")[0], yaxis_index=1, y_axis=df_gr.values.tolist(), label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=3), symbol_size=8, itemstyle_opts=opts.ItemStyleOpts( border_width=1, border_color="", border_color0="white" ), z_level=2, ) ) else: stackbar = Bar() if df_gr is not None: return stackbar.overlap(line) # 如果有次坐标轴最后要用overlap方法组合 else: return stackbar
# 添加折线 # line = Line() # line.add_xaxis(zhongqiu_city) # line.add_yaxis("", tem_data) # line.add_yaxis("", weather_data) # pictorialbar.overlap(line) pictorialbar.render_notebook() # 在双轴图中查看 bar = Bar() bar.add_xaxis(zhongqiu_city) bar.add_yaxis("", weather_data) bar.extend_axis( yaxis=opts.AxisOpts( axislabel_opts=opts.LabelOpts(formatter="{value} °C"), interval=5 ) ) bar.set_global_opts( title_opts=opts.TitleOpts(title="中秋节省会城市降雨和温度情况"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30), is_show=True), yaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_show=False), axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(opacity=0) ), axislabel_opts=opts.LabelOpts(formatter="{value}% 降水概率") ), datazoom_opts=opts.DataZoomOpts() ) bar.set_series_opts(itemstyle_opts={
def generate_bar_html(rows, title): xx1 = [] xx2 = [] yy1 = [] yy2 = [] count = 0 for row in rows: count += 1 bond_code = row[0] bond_code = trade_utils.rebuild_bond_code(bond_code) if count <= 20: xx1.append(row[1].replace('转债', '')) yy1.append({'value': row[2], 'bond_code': bond_code, 'price': row[3], 'premium': row[4], 'name': row[1]}) else: xx2.append(row[1].replace('转债', '')) yy2.append({'value': row[2], 'bond_code': bond_code, 'price': row[3], 'premium': row[4], 'name': row[1]}) max_value = 0 size = len(yy1) for i in range(size): if yy1[i]['value'] + abs(yy2[i]['value']) > max_value: max_value = yy1[i]['value'] + abs(yy2[i]['value']) max_value = round(max_value * 1.1, 2) + 1 chart_id = str(abs(hash(title))) bar = Bar(init_opts=opts.InitOpts(height='700px', width='1424px', theme=ThemeType.SHINE, chart_id=chart_id)) view_utils.add_popwin_js_code(bar, chart_id) # 底部x轴 bar.add_xaxis(xx1) # 顶部x轴 bar.extend_axis( xaxis_data=xx2, xaxis=opts.AxisOpts( type_="category", position='top', axislabel_opts=opts.LabelOpts( rotate=-60, ) ), ) # 右侧y轴 bar.extend_axis( yaxis=opts.AxisOpts( type_="value", position="right", name='跌幅(%)', name_gap=45, name_location='middle', min_=-max_value, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts( is_show=True, ) ), axislabel_opts=opts.LabelOpts(formatter="{value}%"), ) ) # 添加涨的柱状图 bar.add_yaxis("涨", yy1, bar_width=25, category_gap='1%', gap='1%', label_opts=opts.LabelOpts( position="top", formatter=JsCode( "function(x){return x.data['value'] +'%';}" ) ), ) # 添加跌的柱状图 bar.add_yaxis("跌", yy2, bar_width=25, yaxis_index=1, label_opts=opts.LabelOpts( position="bottom", formatter=JsCode( "function(x){return x.data['value'] +'%';}" ) ), ) # bar.reversal_axis() bar.set_series_opts( itemstyle_opts=opts.ItemStyleOpts( color=JsCode( "function(x){return x.data['value']>0?'#c23531':'#1d953f'}" ) ) ) bar.set_global_opts( title_opts=opts.TitleOpts( title="=========" + title + "=========", pos_left='center', pos_top='-1px', ), tooltip_opts=opts.TooltipOpts( is_show=True, formatter=JsCode("function (params){return '名 称: ' + params.data['name'] + '<br/>' + '价 格: ' + params.data['price'] + '元<br/>' + '溢价率: ' + params.data['premium']}") ), legend_opts=opts.LegendOpts(is_show=False), xaxis_opts=opts.AxisOpts( # data=None, # type_='category', # name_gap=0, # name_rotate=90, axislabel_opts=opts.LabelOpts( rotate=-60, ), is_scale=True, name_location='middle', splitline_opts=opts.SplitLineOpts(is_show=False), axisline_opts=opts.AxisLineOpts( is_on_zero=True, # symbol=['none', 'arrow'] ) ), yaxis_opts=opts.AxisOpts( type_='value', name='涨幅(%)', # name_rotate=90, name_gap=35, name_location='middle', # min_=0, max_=max_value, is_scale=True, axislabel_opts=opts.LabelOpts(formatter='{value}%'), splitline_opts=opts.SplitLineOpts(is_show=False), axisline_opts=opts.AxisLineOpts( is_on_zero=False, # symbol=['none', 'arrow'] ) ), ) bar_html = bar.render_embed('template.html', html_utils.env) return bar_html
series_name='治愈数', yaxis_index=2, yaxis_data=cured_num, color='green', ) # 设置额外的坐标轴 bar.extend_axis( # 配置新的纵轴 yaxis=opts.AxisOpts( type_='value', # value 表示数据轴 category 表示类目轴 time 表示时间轴 name='死亡数', is_show=True, # 展示 min_=0, max_=700, # 刻度轴的最大值 position='right', # 显示位置 # offset=60, # 偏离位置 # 轴线配置 axisline_opts=opts.AxisLineOpts( is_show=True, # 显示轴线 # 设置轴线风格 linestyle_opts=opts.LineStyleOpts(color='blue')), # 设置对应的标签, {} 数据 axislabel_opts=opts.LabelOpts(formatter='{value}'))) bar.extend_axis( # 配置新的纵轴 yaxis=opts.AxisOpts( type_='value', # value 表示数据轴 category 表示类目轴 time 表示时间轴 name='治愈数', is_show=True, # 展示 min_=0,
def create_mixed_line_and_bar(type, title, x_list, data_list, data_unit1, data_unit2 = None): """ :param type: 1-折线用于表示变化率and单柱状图+单折线 2-折线用于表示变化率and多柱状图+多折线 3-折线表示占比and单柱状图+单折线 4-折线表示占比and多柱状图+多折线 5-折线用于描述另一维度指标(此时data_list中最后一个k-v为折线数据) :param title: 图表名称 :param x_list: 横坐标内容为时间序列,纵坐标高度为多个(同级)指标的总和,具体各个指标的数值、比例以不同颜色标出 :param data_list: 字典{key1:value1,key2:value2...},构成柱状图的多个不同类型的bar :param data_unit1: 第一根y轴的数值单位 :param data_unit2: 第二根y轴的数值单位 :return: """ c = Bar(init_opts=opts.InitOpts(height="600px",width="900px",theme=ThemeType.MACARONS)) c.add_xaxis(x_list) if type == 1: # 因为有overlap,所以需要自适应调整刻度范围,是的bar和line都能显示出来 all_rate_list = [] for key in data_list.keys(): # 单柱状图只有一个bar change_rate_list = [0] c.add_yaxis(key, data_list[key], bar_width="20%",label_opts=opts.LabelOpts(is_show=True)) for i in range(1,len(data_list[key])): if data_list[key][i-1] == 0 or data_list[key][i-1] is None or data_list[key][i] is None: # 注意分母不为0 change_rate_list.append(None) else: change_rate_list.append(round((data_list[key][i]-data_list[key][i-1])/data_list[key][i-1]*100,2)) all_rate_list.append(change_rate_list) c.extend_axis(yaxis=opts.AxisOpts( name="变化率", type_="value", min_=int(round((getMinRate(all_rate_list)-(getMaxRate(all_rate_list)-getMinRate(all_rate_list)))/10)*10), max_=int(round((getMaxRate(all_rate_list)/10)*10)), interval=10, axislabel_opts=opts.LabelOpts(formatter="{value} %"), )) line = ( Line() .add_xaxis(xaxis_data=x_list) .add_yaxis( series_name="增长率", yaxis_index=1, y_axis=all_rate_list[0], label_opts=opts.LabelOpts(is_show=True, formatter=JsCode( "function(x){console.log(x);return Number(x.data[1]).toFixed(2) + '%';}" )), ) ) c.set_global_opts(title_opts=opts.TitleOpts(title=title,# subtitle="数据来源国家统计局", # pos_left="center",pos_bottom="0px", # item_gap=2, # subtitle_textstyle_opts=opts.TextStyleOpts(color="black") ), legend_opts=opts.LegendOpts(pos_left="right"), yaxis_opts=opts.AxisOpts(name="单位:" + data_unit1, # name_location="end", # name_gap=5, # # name_rotate=45, min_=0, # 基本上指标数据都是为正的 max_=int(round(getMaxData(data_list)/10)*10)*2, interval=10, )) c.overlap(line) elif type == 2: count = len(data_list.keys()) all_rate_list = [] keys_list = [] for key in data_list.keys(): keys_list.append(key) change_rate_list = [0] c.add_yaxis(key, data_list[key], label_opts=opts.LabelOpts(is_show=True)) for i in range(1,len(data_list[key])): if data_list[key][i-1] == 0 or data_list[key][i-1] is None or data_list[key][i] is None: # 注意分母不为0 change_rate_list.append(None) else: change_rate_list.append(round((data_list[key][i]-data_list[key][i-1])/data_list[key][i-1]*100,2)) all_rate_list.append(change_rate_list) c.extend_axis(yaxis=opts.AxisOpts( name="变化率", type_="value", min_=int( round((getMinRate(all_rate_list) - (getMaxRate(all_rate_list) - getMinRate(all_rate_list))) / 10) * 10), max_=int(round((getMaxRate(all_rate_list) / 10) * 10)), interval=10, axislabel_opts=opts.LabelOpts(formatter="{value} %"), )) all_line = [] for i in range(count): line = ( Line() .add_xaxis(xaxis_data=x_list) .add_yaxis( series_name=keys_list[i] + "增长率", yaxis_index=1, y_axis=all_rate_list[i], label_opts=opts.LabelOpts(is_show=True, formatter=JsCode( "function(x){console.log(x);return Number(x.data[1]).toFixed(2) + '%';}" )), ) ) all_line.append(line) c.set_global_opts(title_opts=opts.TitleOpts(title=title, # subtitle="数据来源国家统计局", pos_left="center",pos_bottom="0px", # item_gap=2, # subtitle_textstyle_opts=opts.TextStyleOpts(color="black") ), legend_opts=opts.LegendOpts(pos_left="right"), yaxis_opts=opts.AxisOpts(name="单位:" + data_unit1, # name_location="end", # name_gap=5, # # name_rotate=45, min_=0, max_=int(round(getMaxData(data_list)/10)*10)*2, interval=10, )) for line in all_line: c.overlap(line) src_path = "./指标-年度-图片生成/" html_file_name = src_path + title + ".html" img_file_name = src_path + title + ".png" make_snapshot(snapshot, c.render(html_file_name), img_file_name) print(img_file_name+":生成完毕...")
# from pyecharts.charts import Bar # columns = ['衡阳', '长沙', '株洲', '湘潭', '邵阳', '岳阳', '常德', '张家界', '益阳','娄底','郴州','永州','怀化','湘西'] # # #//设置数据 # data1 = [48,242,80,36,102,156,82,5,60,76,39,44,40,8] # data2 = [5,20,6,5,2,7,6,9,4,3,10,9,4,4] # # # #//设置柱状图的主标题与副标题 # bar = Bar() # #//添加柱状图的数据及配置项 # bar.add("累计感染", columns, data1, mark_line=["average"], mark_point=["max", "min"]) # bar.add("累计死亡", columns, data2, mark_line=["average"], mark_point=["max", "min"]) # #//生成本地文件(默认为.html文件) # bar.render("柱状图.html") from pyecharts.charts import Bar bar = Bar() bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]) #bar.set_series_opts() bar.add_yaxis("商家A", [5.5, 20, 36, 10, 75, 90]) bar.extend_axis(15) #bar.add_yaxis("商家B", [5, 20, 36, 10, 75, 90]) #bar.add_yaxis("商家B", [5, 20, 36, 10, 75, 90]) #bar.set_global_opts(opts.TitleOpts(title= "主标题", subtitle = "副标题")) bar.render()