当前位置:   article > 正文

pyecharts制作柱状图和折线图_pyecharts柱状图加折线

pyecharts柱状图加折线

图表

数据分析工作,离不开图表的展示。有时候表展示的数据更加清晰,有时候图绘制的形状更加直观。

最常用的办公工具Excel就是不错的选择,但是自动化比较难。

现在数据分析常用的编程语言是python,所以推荐一款用来绘制交互图的工具——pyecharts

pyecharts将python和echarts结合在一起,使得数据分析的结果展示更加方便,更加美观。

数据准备

比如这次遇到这样的需求:分析一下2020年数据与2019年同期数据的对比分析工作,数据大概如下图,一列日期,一列数据。(案例数据用excel随机生成),数据截止到2020-06月份。

数据

数据清洗

1、要求对比2020年数据和2019年同月份的数据,这就需要有两个月份列表,如下:

last_year_month = ['2019-01', '2019-02', '2019-03', '2019-04', '2019-05', '2019-06',]
now_year_month = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06']
# 下面代码可以自动生成上面的列表数据

  • 1
  • 2
  • 3
  • 4

但是这样不“智能”,每个月都需要手动加一下,虽然简单但是麻烦。

所以需要用代码自动生成两个对比的月份列表,我写的比较麻烦,应该有更简单的办法,我还没有找到。先这样写吧。

import datetime
now_year = datetime.datetime.now().year
now_month = datetime.datetime.now().month
now_year_month = []
last_year_month = []
for m in range(1,now_month):
    if m < 10:
        now_year_month.append("{0}-0{1}".format(str(now_year),str(m)))
        last_year_month.append("{0}-0{1}".format(str(now_year-1),str(m)))
    else:
        now_year_month.append("{0}-{1}".format(str(now_year),str(m)))
        last_year_month.append("{0}-{1}".format(str(now_year-1),str(m)))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2、对比的日期列表现在有了,但是图表应该如何展示?思来想去,最终决定——用月份做横坐标,数据作为纵坐标,将2019年和2020年的柱状图、折线图展示在图表中。

初期柱状图效果如下:

pyecharts柱状图

在pyecharts1.8.0以上版本,可以直接将柱状图转为折线图。

折线图效果如下:

pyecharts折线图

其中,两条虚线表示对应的平均值。

版本V1制作过程

版本V1要求对比同期的数据即可。

具体步骤如下:

1、将“日期”拆分为“年份”和“月份”

df["年份"] = df["日期"].map(lambda x:str(int(x.split("-")[0]))+"年" if pd.notnull(x) else np.nan)
df["月份"] = df["日期"].map(lambda x:str(int(x.split("-")[1]))+"月" if pd.notnull(x) else np.nan)
  • 1
  • 2

2、筛选对应的数据,为了保证数据按照时间排好序,需要用sort_values将数据排序

# 柱状图与折线图表示
last_year_df = df[df["日期"].isin(last_year_month)].sort_values(by="日期")
now_year_df = df[df["日期"].isin(now_year_month)].sort_values(by="日期")
  • 1
  • 2
  • 3

3、用pyecharts画图

pyecharts图表教程有很多实例,只需要修改一下数据就可以完成很漂亮的交互式图表。

from pyecharts.charts import Line, Grid
from pyecharts import options as opts
# V1版本
def bar_line(subtitle_text=None):
    x = now_year_df["月份"].astype(str).tolist()
    y1 = last_year_df['数据'].tolist()
    y2 = now_year_df['数据'].tolist()
    bar = (
        Bar(init_opts=opts.InitOpts(width="1000px", height="500px",bg_color="white"))
           .add_xaxis(x)
           .add_yaxis(
               '2019年数据', y1, color="rgba(51,75,92,1)",
               markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(name="均值",type_="average")]),
            )
           .add_yaxis(
               '2020年数据', y2, color="rgba(194,53,49,1)",
               markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(name="均值",type_="average")]),
           )
        .set_global_opts(
            title_opts=opts.TitleOpts(title='同期数据对比',subtitle=subtitle_text),
            toolbox_opts=opts.ToolboxOpts(),
            legend_opts=opts.LegendOpts(orient='vertical', pos_right='1%', pos_top='20%'),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
            )
        )
    grid = (Grid(init_opts=opts.InitOpts(width="1000px", height="500px",bg_color="white"))
            .add(bar, grid_opts=opts.GridOpts(pos_bottom="15%"))
            )
    return grid
v1 = bar_line(subtitle_text="数据随机生成")
v1.render_notebook()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

版本V2制作过程

版本V2需要在图表上加上“阀值线”,以及展示同期下一个月的数据。比如:现在是2020-06,展示的数据要加上2019-07的数据。

1、加上同期下一个月的数据

import datetime
now_year = datetime.datetime.now().year
now_month = datetime.datetime.now().month
now_year_month = []
last_year_month = []
for m in range(1,now_month):
    if m < 10:
        now_year_month.append("{0}-0{1}".format(str(now_year),str(m)))
        last_year_month.append("{0}-0{1}".format(str(now_year-1),str(m)))
    else:
        now_year_month.append("{0}-{1}".format(str(now_year),str(m)))
        last_year_month.append("{0}-{1}".format(str(now_year-1),str(m)))
# 将下一期的数据添加上去
if 10<now_month<=11:
    last_year_month.append("{0}-{1}".format(str(now_year-1),str(now_month)))
elif now_month == 12:
    pass
else:
    last_year_month.append("{0}-0{1}".format(str(now_year-1),str(now_month)))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2、修改画图代码

# 版本1
def bar_line(subtitle_text=None):
    # 横坐标用去年的月份
    x = last_year_df["月份"].astype(str).tolist()
    y1 = last_year_df['数据'].tolist()
    y2 = now_year_df['数据'].tolist()

    bar = (
        Bar(init_opts=opts.InitOpts(width="1000px", height="500px",bg_color="white"))
           .add_xaxis(x)
           .add_yaxis(
               '2019年数据', y1, color="rgba(51,75,92,1)",
               markline_opts=opts.MarkLineOpts(data=[
                   opts.MarkLineItem(name="均值",type_="average"),
                   # 加上阀值线
                   opts.MarkLineItem(name="阀值",y=3000),
               ]),
            )
           .add_yaxis(
               '2020年数据', y2, color="rgba(194,53,49,1)",
               markline_opts=opts.MarkLineOpts(data=[
                   opts.MarkLineItem(name="均值",type_="average"),
                   # 加上阀值线
                   opts.MarkLineItem(name="阀值",y=3000)
               ]),
           )
        .set_global_opts(
            title_opts=opts.TitleOpts(title='同期数据对比',subtitle=subtitle_text),
            toolbox_opts=opts.ToolboxOpts(),
            legend_opts=opts.LegendOpts(orient='vertical', pos_right='1%', pos_top='20%'),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
            )
        )
    grid = (Grid(init_opts=opts.InitOpts(width="1000px", height="500px",bg_color="white"))
            .add(bar, grid_opts=opts.GridOpts(pos_bottom="15%"))
            )
    return grid
v2 = bar_line(subtitle_text="数据随机生成")
v2.render_notebook()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

效果图如下:

pyecharts柱状图

结论

如果你的工作也需要画图,那么pyecharts就是一个很不错的工具,pyecharts官网的教程十分详细,建议阅读方式:先看案例,如果需要修改内容在看详细教程。

更多好玩的内容,欢迎关注微信公众号“数据与编程之美”

数据与编程之美

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/106604?site
推荐阅读
相关标签
  

闽ICP备14008679号