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 np import pandas as pd from pyecharts.globals import ThemeType from pyecharts import options as opts from 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('-------------------')
|