Beispiel #1
0
 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
Beispiel #2
0
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
Beispiel #4
0
 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
Beispiel #5
0
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={
Beispiel #7
0
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 '名&nbsp;&nbsp;&nbsp;称: ' + params.data['name'] + '<br/>' + '价&nbsp;&nbsp;&nbsp;格: ' + 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
Beispiel #8
0
    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,
Beispiel #9
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+":生成完毕...")
Beispiel #10
0
# 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()