使用pyecharts从excel取数建立堆积柱状图

14 篇文章 0 订阅
3 篇文章 0 订阅

pyecharts本身其实并不难,代码简单,语法简单,网上教程很多,文档也是中文的,并不难看懂,但是并没有一个教程教我们怎么把数据从excel里提取出来,再放到pyecharts里对应的参数里面区,花了大半天时间写了一个自动从excel取数并生成堆积柱状图的自定义函数,供各位入门小白参考。
excel图表格式如下:
在这里插入图片描述
对于这个堆积柱状图,我想做到这几点:
1、以“区”和“大品类别”作为维度,做出两个柱状图
2、柱状图体现的是过去7天的数据
3、以金额或者数量进行汇总
4、以堆积的形态体现柱状图
5、以日期为X轴,“区”或者“大品类别”为Y轴
以下是代码

from pyecharts.charts import Bar # 非自带库,需要自己安装
from pyecharts import options as opts
import datetime
import pandas as pd # 非自带库,需要自己安装
import numpy as np # 非自带库,需要自己安装
from pyecharts.commons.utils import JsCode

# 先定义3个全局变量
database = pd.read_excel(r'D:\1\map\database.xlsx',encoding='utf8')
bu = ['事业一部', '事业二部', '事业三部']
product = ['CAN','TPL','PET']

# 让代码简洁一点,所以先封装一个函数,之后输入参数就可以
def last_7days(bp,index_table,cols):
    # bp:是第一个参数,由前面的两个数列进行定义,输入bu或者product
    # index:是第二个参数,如bp选了bu,则columns应填写'区',如填了product,则填写’大品类别‘
    # cols:是第三个参数,pivot里的字段columns,应为excel中的标题中的一个字段,用于生成pivot的列
    today = datetime.date.today()
    day = datetime.timedelta(days=1)
    x_attr = [today-day*7,today-day*6,today-day*5,today-day*4,today-day*3,today-day*2,today-day]
    db = database.query('日期'+'=='+ str([str(today-day),str(today-day*2),str(today-day*3),
                                        str(today-day*4),str(today-day*5),str(today-day*6),str(today-day*7)]
                                       ))
    # 以上这部分是先定义过去7天的日期,并把过去7天的数据从database里提取出来,提升预算速度
    table = pd.pivot_table(db,index=index_table,columns=cols,values='金额',aggfunc=np.sum,fill_value=0)
    # 先利用pandas形成透视表,以获取所需数据
    bp0 = table.query(index_table+'=='+str([bp[0]]))
    bp1 = table.query(index_table+'=='+str([bp[1]]))
    bp2 = table.query(index_table+'=='+str([bp[2]]))
    # 形成透视表后,再筛选出每个Y轴所需数据
    def xrow(a):
        for index, row in a.iterrows():
            xrow = [int(row[-7]//1000), int(row[-6]//1000), int(row[-5]//1000),
                    int(row[-4]//1000), int(row[-3]//1000), int(row[-2]//1000),int(row[-1]//1000)]
            return xrow
    # 但还不能直接用于柱状图,还要对数据做一下切片,而且原始数据是float格式,需要改成int格式,让图表美观一点
    product_bar = (
        Bar()
        .add_xaxis(x_attr)
        .add_yaxis(bp[0], xrow(bp0), stack=True)
        .add_yaxis(bp[1], xrow(bp1), stack=True)
        .add_yaxis(bp[2], xrow(bp2), stack=True)
        .set_global_opts(title_opts=opts.TitleOpts(title="过去7天事业部发货情况",subtitle='单位:千元'))
        # 大部分人应该习惯用千位分隔符来看数据,以下从formatter开始到结束,是调用jscode把柱状图的数据变成千位分隔符格式
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='inside', formatter=JsCode("""
            function(a){
            var result = [ ], counter = 0;
            var num_array = a.data.toString().split('.');
            var num = num_array[0];
            var newstr = '';
            for (var i = num.length - 1; i >= 0; i--) {
                counter++;
                result.unshift(num[i]);
                if (!(counter % 3) && i != 0) { 
                    result.unshift(',');
                }
            }
            if(num_array.length>1){
                newstr = result.join('');
                newstr += '.'+num_array[1];
                return newstr;
            }else{
                return result.join('');
            }
            }""")))
    )
    product_bar.render(index_table +'.html')

    # print(bp0)

last_7days(bu,'区','日期')
last_7days(product,'大品类别','日期')

感谢Jerelli的文章https://blog.csdn.net/jerurry/article/details/100655035,怎么把柱状图里的数据做成千位分隔符我想了很久一直没办法,这里提供了完整的代码,直接拿来用了。

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White_Mountain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值