0
点赞
收藏
分享

微信扫一扫

【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为


目录

​​精彩案例汇总​​

​​效果展示​​

​​1、动态效果图 ​​

​​2、实时分片数据图​​

​​ 3、丰富的主题样式​​

​​chalk​​

​​macarons ​​

​​westeros​​

​​walden​​

​​一、 确定需求方案​​

​​1、确定产品上线部署的屏幕LED分辨率​​

​​2、功能模块​​

​​3、部署方式:​​

​​二、整体架构设计​​

​​三、编码实现 (基于篇幅及可读性考虑,此处展示部分关键代码)​​

​​1、前端html代码​​

​​2、前端JS代码​​

​​3、后端python代码​​

​​四、上线运行​​

​​五、源码下载​​

​​精彩案例汇总​​

近年来,数据可视化大屏的出现,掀起一番又一番的浪潮,众多企业主纷纷想要打造属于自己的 “酷炫吊炸天” 的霸道总裁大屏驾驶舱。今天为大家分享的是 【用户行为 数据可视化大屏】

之前小伙伴们建议我出一些视频课程来学习Echarts,这样可以更快上手,所以我就追星赶月的录制了​​《Echarts - 0基础入门课程》​​​​Echarts-0基础入门--其他视频教程-编程语言​​ ,希望小伙伴们多多支持。

精彩案例汇总

​​YYDatav的数据可视化《精彩案例汇总》_YYDataV的博客-​​

话不多说,开始分享干货,欢迎讨论!

效果展示



1、动态效果图 

【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为_javascript

2、实时分片数据图

【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为_javascript_02

 3、丰富的主题样式

为了满足不同用户的审美需求,本案例实现了多个主题样式:

chalk

【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为_echarts_03

macarons 【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为_python_04

roma 【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为_数据可视化_05

westeros【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为_数据可视化_06

 walden【7】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 用户行为_echarts_07

一、 确定需求方案



1、确定产品上线部署的屏幕LED分辨率

1280px*768px,F11全屏后占满整屏且无滚动条;其它分辨率屏幕均可自适应显示。



2、功能模块

根据市场上同类产品数据分析的关键指标,本案例实现的功能模块如下:


  • 年龄分布
  • 性别占比
  • 地域分布
  • 终端系统分布
  • 机型价格分布
  • 访问来源分布
  • 产品印象

3、部署方式:


  1. B/S版: 可以流畅的运行在 PC (Windows系统,Linux及各衍生系统)和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等);
  2. C/S版: 整个项目仅一个可执行文件,超简单的方式,没有之一。

二、整体架构设计


  1. 前端基于Echarts开源库设计,使用WebStorm编辑器;
  2. 后端基于Python Web实现,使用Pycharm编辑器;
  3. 数据传输格式:JSON;
  4. 数据源类型:支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite、Excel表格等,还可以定制HTTP API接口方式或其它类型数据库。
  5. 数据更新方式:摒弃了前端页面定时拉取的方式(这种方式带来严重的资源浪费),采用后端数据实时更新,实时推送到前端展示;

三、编码实现 (基于篇幅及可读性考虑,此处展示部分关键代码)

1、前端html代码

<html>

<head>
<title>数据可视化大屏解决方案</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<style type="text/css">

</style>
</head>
<link rel="icon" type="image.png" href="/static/images/favicon.ico">
<link rel="stylesheet" href="/static/js/fun.css">
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<script src="/static/echart/opt/vue.js"></script>
<script src="/static/echart/opt/dv.js"></script>
<script src="/static/js/jquery-2.2.3.min.js"></script>


<body style="background-color: #050e27">

<div class="container_fluid">
<div class="row_fluid" id="vue_app">
<div style="padding:0 0" class="col-xs-12 col-md-12">
<dv-decoration-1 style="height:4%;">
</dv-decoration-1>

<h3 id="container_h"></h3>

</div>

<div style="padding:0 0" class="col-xs-12 col-md-3">

<dv-border-box-1 style="height:29%;padding:0 0" class="col-xs-12 col-md-12">
<div style="height:100%;padding:5% 5% 5% 5%;" id="container_0"></div>
</dv-border-box-1>

<div style="padding:0 0" class="col-xs-12 col-md-12">
<dv-border-box-1 style="height:29%;padding:0 0" class="col-xs-12 col-md-12">
<div style="height:100%;padding:5% 5% 5% 5%;" id="container_1"></div>
</dv-border-box-1>
</div>

<div style="padding:0 0" class="col-xs-12 col-md-12">
<dv-border-box-1 style="height:29%;padding:0 0" class="col-xs-12 col-md-12">
<div style="height:100%;padding:5% 5% 5% 5%;" id="container_2"></div>
</dv-border-box-1>
</div>
</div>

<div style="padding:0 0" class="col-xs-12 col-md-6">

<dv-border-box-1 style="height:87%;padding:0 0" class="col-xs-12 col-md-12">
<div style="height:100%;padding: 2% 2% 2% 2%" id="container_3"></div>
</dv-border-box-1>
</div>

<div style="padding:0 0" class="col-xs-12 col-md-3">
<dv-border-box-1 style="height:29%;padding:0 0" class="col-xs-12 col-md-12">
<div style="height:100%;padding:5% 5% 5% 5%;" id="container_4"></div>
</dv-border-box-1>

<div style="padding:0 0" class="col-xs-12 col-md-12">
<dv-border-box-1 style="height:29%;padding:0 0" class="col-xs-12 col-md-12">
<div style="height:100%;padding:5% 5% 5% 5%;" id="container_5"></div>
</dv-border-box-1>
</div>

<div style="padding:0 0" class="col-xs-12 col-md-12">
<dv-border-box-1 style="height:29%;padding:0 0" class="col-xs-12 col-md-12">
<div style="height:100%;padding:5% 5% 5% 5%;" id="container_6"></div>
</dv-border-box-1>
</div>
</div>

</div>
</div>
</body>

</html>

2、前端JS代码

var idContainer_0 = "container_0";
function initEchart_0() {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById(idContainer_0), gTheme);
option = {
title: [
{
text: "年龄分布",
left: "left",
textStyle: {
color: "#3690be",
fontSize: "10",
},
},
],
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b}: {c} ({d}%)",
position: function (p) {
//其中p为当前鼠标的位置
return [p[0] + 10, p[1] - 10];
},
},
legend: {
top: "80%",
itemWidth: 10,
itemHeight: 10,
// data: [],
textStyle: {
color: "rgba(255,255,255,.5)",
fontSize: "10",
},
},
series: [
{
name: "年龄分布",
type: "pie",
center: ["50%", "42%"],
radius: ["40%", "60%"],
// color: ['#065aab', '#066eab', '#0682ab', '#0696ab', '#06a0ab', '#06b4ab', '#06c8ab', '#06dcab', '#06f0ab'],

// 环形图的组成部分不显示文字
label: { show: false },
// labelLine: { show: false },
// data: [
// { value: 1, name: '0岁以下' },
// { value: 4, name: '20-29岁' },
// { value: 2, name: '30-39岁' },
// { value: 2, name: '40-49岁' },
// { value: 1, name: '50岁以上' },
// ]
},
],
};

// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();
});
}

function asyncData_0() {
$.getJSON("json/echart_0.json").done(function (data) {
var myChart = echarts.init(document.getElementById(idContainer_0));
myChart.setOption({
series: [{ data: data }],
});
}); //end $.getJSON
}

initEchart_0();
asyncData_0();

3、后端python代码

# -*- coding:utf-8 -*-

import io
import os
import sys
import urllib
import json
from http.server import HTTPServer, SimpleHTTPRequestHandler, ThreadingHTTPServer

ip = "localhost" # 监听IP,配置项
port = 8815 # 监听端口,配置项
index_url = "http://%s:%d/index.html" %(ip, port) # 监听主页url,配置项

class MyRequestHandler(SimpleHTTPRequestHandler):
protocol_version = "HTTP/1.0"
server_version = "PSHS/0.1"
sys_version = "Python/3.7.x"
target = "./" # 监听目录,配置项

def do_GET(self):
if self.path.find("/json/") > 0:
print(self.path)
req = {"success": "true"}
self.send_response(200)
self.send_header("Content-type", "json")
self.end_headers()
with open(self.path, 'r', encoding="utf-8") as f:
data = json.load(f)
rspstr = json.dumps(data)
self.wfile.write(rspstr.encode("utf-8"))

else:
SimpleHTTPRequestHandler.do_GET(self);

def do_POST(self):
if self.path == "/signin":
print("postmsg recv, path right")
else:
print("postmsg recv, path error")
data = self.rfile.read(int(self.headers["content-length"]))
data = json.loads(data)
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
rspstr = "recv ok, data = "
rspstr += json.dumps(data, ensure_ascii=False)
self.wfile.write(rspstr.encode("utf-8"))


def HttpServer():
try:
server = HTTPServer((ip, port), MyRequestHandler)
listen = "http://%s:%d" %(ip, port)
print("服务器监听地址: ", listen)
server.serve_forever()
except ValueError as e:
print("Exception", e)
server.socket.close()

if __name__ == "__main__":
HttpServer()

四、上线运行

​​五、源码下载​​

​​【源码】数据可视化:基于Echarts+Python实现的动态实时大屏范例7-用户分析.zip_大屏的酷炫echarts-管理软件文档类资源-​​


注:源码包括​​python​​的webserver + json数据源码 + echarts

启动命令:打开cmd命令行,切换到案例根目录,运行 python httpserver.py


举报

相关推荐

0 条评论