在Web开发过程中遇到要做些数据可视化工作,对于我来说,基本上后端使用Pyecharts配合着前端echarts.js实现数据可视化工作。
Pyechats介绍
✨ 特性
- 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
- 囊括了 30+ 种常见图表,应有尽有
- 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
- 可轻松集成至 Flask,Django 等主流 Web 框架
- 高度灵活的配置项,可轻松搭配出精美的图表
- 详细的文档和示例,帮助开发者更快的上手项目
- 多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持
版本
Pyechats有两个大版本,分为v0.5.X和v1。这两个版本像python2和python3一样相互不兼容,而且v1版本使用了python3.6+更新新的语法特性,所以v1版本只支持python3.6+。
Pyecharts使用
在Web开发过程中,两个版本的Pyechats都使用过,使用的场景也不同。
场景一:Top10柱状图展示
在一次爬虫数据展示中,爬取诗词名句网中诗人作品,并将作品数量前十的诗人展示出来。那时,还是第一次使用pyechats,使用的是0.5.1版本,可以说,第一次接触可视化工具,对于前端知识不怎么了解的我,使用起来还是非常方便的。对于这个场景,通过导入相应的图表如使用如:
1 | Bar 柱状图 |
2 | Pie 饼状图 |
3 | Line 折线图 |
主要使用这些图,还有其他图表如:Funnel(漏斗图)、Gauge(仪表盘)等等,如果有需要,详情请见Pyechats基本图表
- 后端
- 导入柱状图表
Bar类,以及页面Page类1from pyecharts import Bar, Page - 定义一个函数,从数据库中查询数据,返回返回Bar的实例
1def get_bar():2poets = Poet.query.order_by(Poet.num.desc()).limit(10) #获取诗人作品量前十的诗人3attr_poet = [] #定义x轴数据,诗人姓名4num_poet = [] #定义y轴数据,诗人作品数5for poet in poets:6attr_poet.append(poet.name) #填充x轴数据7num_poet.append(poet.num) #填充y轴数据8bar = Bar("作诗数前十名诗人") #实例9bar.add("", attr_poet, num_poet, is_label_show=True, center=[50,50]) #将数据添加10return bar #返回实例 - 在视图中渲染给前端
12def search():3page = Page() #创建一个页面实例4bar = get_bar() #执行函数,得到Bar实例5page.add(bar) #将图表添加带页面类中,如果页面中有多个图:page.add([bar1, bar2, ....])6return render_template('search.html', chart=page.render_embed()) #渲染页面,返回chart
- 前端
- 导入echarts.js
1<script src="{{ url_for('static', filename='js/echarts.min.js') }}"></script> - 在相应位置使用Jinja2语法引用chart这样就实现数据展示,展示如下:
1<div>2{{ chart|safe }}3</div>
如果有兴趣研究项目地址如下:shicimingju
场景二:数据实时展示
在近期的项目中,遇到了要实时更新的数据,类似实时展示24小时用户在线数量,这样的话每一个小时都要向后端请求一次数据,然后重新渲染图表,实现效果如下;
配合着Layui的轮播图展示,为了实现这个功能,我使用了v1的版本,这个相比于0.5版本,这个版本的实现效果更佳深入用户体验。实现这个功能使用Pyecharts也非常方便。
- 后端
因为v1版本对代码进行了重构,所有导包方式也发生了变化
- 新版本的Pyecharts将图表封装到
pyecharts.charts这个文件中,将配置封装到options文件中,将两者分开,所以导包时:1from pyecharts import options as opts2from pyecharts.charts import Line - 与
0.5版本类似,首先写个函数创建图表,由于还没正式上线,所以为假数据。1def bar_base() -> Line:2c = (3Line()4.add_xaxis(xaxis_data=list(map(lambda x: '{}:00'.format(x), [i for i in range(25)])))5.add_yaxis("在线人数", [random.randint(25, 150) for _ in range(25)], is_smooth=True, color='#66CDAA',6label_opts=opts.LabelOpts(is_show=False))7.set_series_opts(8areastyle_opts=opts.AreaStyleOpts(opacity=0.5),9)10.set_global_opts(11title_opts=opts.TitleOpts(title="今日在线人数", pos_left='43%', pos_top='8%'),12xaxis_opts=opts.AxisOpts(13axistick_opts=opts.AxisTickOpts(is_align_with_label=True),14is_scale=False,15boundary_gap=False,16),17legend_opts=opts.LegendOpts(is_show=False),18)19)20return c - 定义一个视图函数进行,进行与前端交互
123def get_bar_chart():4c = bar_base()5return c.dump_options()
- 前端
引用echarts.js
1<script src="{{ url_for('static', filename='common/echarts.min.js') }}"></script>结合
Layui的轮播图,将生成的图表放入轮播图中1<div class="layui-carousel" id="test1" lay-filter="test1">2<div carousel-item="">3<div id="bar" style="background-image: url('{{ static('admin/img/timg.gif') }}');"></div>4<div>条目2</div>5<div>条目3</div>6<div>条目4</div>7<div>条目5</div>8</div>9</div>通过JS实现AJAX轮询操作
12var chart = echarts.init(document.getElementById('bar'), 'essos', {renderer: 'canvas'});3window.onresize = function(){4chart.resize();5};6chart.setOption({78toolbox: {9show: true,10feature: {11mark: {show: true},12dataView: {show: true, readOnly: false},13magicType: {show: true, type: ['line', 'bar', 'stack', 'tiled']},14restore: {show: true},15saveAsImage: {show: true}16}17},18});19$(20function () {21fetchData(chart);22setInterval(fetchData, 1000 * 60);23}24);2526function fetchData() {27$.ajax({28type: "GET",29url: "/barChart",30dataType: 'json',31success: function (result) {32chart.setOption(result);33}34});35}36});这样就可以实现相应的功能了。
总结
在开发过程中,使用过多次Pyecharts,通过记录这两次场景应用,方便以后的学习,数据可视化还需要更深入的研究,以后还会继续学习相关知识。