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,怎么把柱状图里的数据做成千位分隔符我想了很久一直没办法,这里提供了完整的代码,直接拿来用了。