python数据可视化:基于pyecharts的BI可视化报表(I)
1
大家好!
现在很多公司慢慢都会有自己的BI大屏可视化数据系统,要么自己开发、要么外包,要有多炫就有多炫。
于是乎部门的老板们对于报表的眼光也越来越高,要求也越来越过分,当然费用是没有的、技术支持也是没有的、加班工资也是没有的o(╥﹏╥)o。
还好我知道一句话:“人生苦短我用python”!
今天来分享一下如何用Python基于pyecharts库制作一张BI可视化报表(I),仅仅抛砖引玉,效果还很差,大家多见谅,如下图所示。
2
案例中数据表格结构如下:
3
代码及演示:
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
fn = '''
function(params) {
if(params.name == '缺口')
return '\\n\\n\\n';
return params.name + ' : ' + params.value + '% ';
}
'''
def new_label_opts():
return opts.LabelOpts(formatter=JsCode(fn), position='center')
pie1 = (
Pie(init_opts=opts.InitOpts(width='250px', height='140px',theme = ThemeType.CHALK))
.add(
'',
[['月达成',70],['缺口',30]],
center=['25%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.add(
'',
[['年达成',68],['缺口',32]],
center=['75%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.set_global_opts(
title_opts=opts.TitleOpts(title='SX',pos_left = '43%'),
legend_opts=opts.LegendOpts(
is_show = 0,type_='scroll', pos_top='20%', pos_left='80%', orient='vertical'
),
)
#.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:'))
#.render('mutiple_pie.html')
)
pie1.render_notebook()
import numpy as npimport pandas as pdfrom pyecharts.globals import ThemeTypefrom pyecharts import options as optsfrom pyecharts.charts import Map
df_map = pd.read_excel('D:\\01\\会Excel的隔壁老王\\Excel报表\\20200529-Python个人中心可视化报表\\20200529-Python个人中心可视化报表.xlsx',sheet_name = '全国二级机构年累计计划达成')
map1 = ( Map(init_opts=opts.InitOpts(width='750px', height='400px',theme = ThemeType.CHALK)) .add('全国二级机构年累计计划达成', df_map[['二级机构','年累计计划达成率']].values.tolist(), 'china') .set_global_opts( title_opts=opts.TitleOpts(title='全国二级机构年累计计划达成(微信公众号:会Excel的隔壁老王)',pos_bottom = '88%', pos_right = '14%'), visualmap_opts=opts.VisualMapOpts(type_= 'color',max_=1.65, min_ = 1.0, range_text = ['计划达成率区间:', ''],is_piecewise=1,pos_top= 'middle',pos_left='right',orient='vertical',split_number=5, textstyle_opts = opts.TextStyleOpts(color = '#ffffff')), #tooltip_opts = opts.TooltipOpts(formatter='{c} %') ) #.render('map_visualmap_piecewise.html'))
map1.render_notebook()
4
完整python代码参考:
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import numpy as np
import pandas as pd
from pyecharts.globals import ThemeType
from pyecharts.charts import *
from bs4 import BeautifulSoup
fn = '''
function(params) {
if(params.name == '缺口')
return '\\n\\n\\n';
return params.name + ' : ' + params.value + '% ';
}
'''
def new_label_opts():
return opts.LabelOpts(formatter=JsCode(fn), position='center')
pie1 = (
Pie(init_opts=opts.InitOpts(width='250px', height='140px',theme = ThemeType.CHALK))
.add(
'',
[['月达成',70],['缺口',30]],
center=['25%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.add(
'',
[['年达成',68],['缺口',32]],
center=['75%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.set_global_opts(
title_opts=opts.TitleOpts(title='SX',pos_left = '43%'),
legend_opts=opts.LegendOpts(
is_show = 0,type_='scroll', pos_top='20%', pos_left='80%', orient='vertical'
),
)
#.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:'))
#.render('mutiple_pie.html')
)
#1-------------------------------------------------------------------------------------------------------------
pie2 = (
Pie(init_opts=opts.InitOpts(width='250px', height='140px',theme = ThemeType.CHALK))
.add(
'',
[['月达成',30],['缺口',70]],
center=['25%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.add(
'',
[['年达成',68],['缺口',32]],
center=['75%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.set_global_opts(
title_opts=opts.TitleOpts(title='SSY',pos_left = '40%'),
legend_opts=opts.LegendOpts(
is_show = 0,type_='scroll', pos_top='20%', pos_left='80%', orient='vertical'
),
)
#.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:'))
#.render('mutiple_pie.html')
)
#2-------------------------------------------------------------------------------------------------------------
pie3 = (
Pie(init_opts=opts.InitOpts(width='250px', height='140px',theme = ThemeType.CHALK))
.add(
'',
[['月达成',50],['缺口',50]],
center=['25%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.add(
'',
[['年达成',68],['缺口',32]],
center=['75%', '50%'],
radius=[42, 55],
label_opts=new_label_opts(),
)
.set_global_opts(
title_opts=opts.TitleOpts(title='SXDX',pos_left = '40%'),
legend_opts=opts.LegendOpts(
is_show = 0,type_='scroll', pos_top='20%', pos_left='80%', orient='vertical'
),
)
#.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:'))
#.render('mutiple_pie.html')
)
#3-------------------------------------------------------------------------------------------------------------
df_map = pd.read_excel('D:\\01\\会Excel的隔壁老王\\Excel报表\\20200529-Python个人中心可视化报表\\20200529-Python个人中心可视化报表.xlsx',sheet_name = '全国二级机构年累计计划达成')
map1 = (
Map(init_opts=opts.InitOpts(width='750px', height='400px',theme = ThemeType.CHALK))
.add('全国二级机构年累计计划达成', df_map[['二级机构','年累计计划达成率']].values.tolist(), 'china')
.set_global_opts(
title_opts=opts.TitleOpts(title='全国二级机构年累计计划达成(微信公众号:会Excel的隔壁老王)',pos_bottom = '88%', pos_right = '14%'),
visualmap_opts=opts.VisualMapOpts(type_= 'color',max_=1.65, min_ = 1.0, range_text = ['计划达成率区间:', ''],is_piecewise=1,pos_top= 'middle',pos_left='right',orient='vertical',split_number=5, textstyle_opts = opts.TextStyleOpts(color = '#ffffff')),
#tooltip_opts = opts.TooltipOpts(formatter='{c} %')
)
#.render('map_visualmap_piecewise.html')
)
#4-------------------------------------------------------------------------------------------------------------
big_title = (
Pie()
.set_global_opts(
title_opts=opts.TitleOpts(title='可视化报表',title_textstyle_opts=opts.TextStyleOpts(font_size=40, color='#FFFFFF',border_radius=True, border_color='white'),pos_top=0)
)
)
page = (Page(page_title='可视化报表')
#.add(big_title)
.add(pie1)
.add(pie2)
.add(pie3)
.add(map1)
).render('可视化报表.html')
with open('可视化报表.html', 'r+', encoding='utf-8') as html:
html_bf = BeautifulSoup(html, 'lxml')
divs = html_bf.select('.chart-container')
divs[0]['style'] = 'width:250px;height:140px;position:absolute;top:5px;left:0px;border-style:solid;border-color:#FFFFFF;border-width:0px;'
divs[1]['style'] = 'width:250px;height:140px;position:absolute;top:5px;left:250px;border-style:solid;border-color:#444444;border-width:0px;'
divs[2]['style'] = 'width:250px;height:140px;position:absolute;top:5px;left:500px;border-style:solid;border-color:#444444;border-width:0px;'
divs[3]['style'] = 'width:750px;height:540px;position:absolute;top:145px;left:0px;border-style:solid;border-color:#444444;border-width:0px;'
body = html_bf.find('body')
body['style'] = 'background-color:#ffffff;'
html_new = str(html_bf)
html.seek(0, 0)
html.truncate()
html.write(html_new)
html.close()
print('-------------------')