超燃,拿来即用!Echarts动态排名柱状图(自适应电脑和手机端)说明文档

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
数据可视化DataV,5个大屏 1个月
简介: 超燃,拿来即用!Echarts动态排名柱状图(自适应电脑和手机端)说明文档

项目说明

动态排名柱状图能很好的表达在某一个时间周期,随着时间的变化,各参数指标的增减变化,形象直观,让人很容易理解。


项目人性化,仅需在Excel中录入数据,点击start.exe即可运行;

无需过度配置,如果数据量少导致动画卡顿,config.js中调整间隔时间即可;

自适应PC端和手机端;

本地可以直接运行;如果在服务器端访问,首次或修改表格文件启动start.exe生成数据即可;

源代码:https://download.csdn.net/download/weixin_41290949/29952910


开发说明

  • 基于百度开运Echarts 5.0开发;
  • 自带python应用执行程序start.exe,读取excel并转化为json数据


项目目录

├─index.html …图表静态文件

├─start.exe …启动程序

├─css …样式表目录

│ ├─common.css …核心样式表

├─js …JS封装库

│ ├─config.js …图表常用参数配置文件

│ ├─echarts5.min.js …echarts封装库

│ ├─jquery-3.3.1.min.js …jquery封装库

├─data …数据文件

│ ├─lockdata.xls …源数据文件

│ ├─data.json …动态产生的JSON数据


配置文件

/*
 * *Created by Poleung
 * *Email 30930572@qq.com
 * *Create date 2021-10-08
 * *Copyright LockDataV
 * *Desc data visualization project based on echarts5.0.js.
 */
//标题名称;
var title = '各省市历年GDP数据可视化动态排名';
/*子标题*/
var subtext = '数据来源:全国1949-2016年GDP数据统计(纯属虚构)';
/*主标题字号*/
var titleSize = '20';
/*参数说明:更新间隔时间
* 根据数据量的多少调整
* 2*1000,代表2秒
* */
var updateFrequency = 2000;
/*参数说明:选择第N列数据
* 0代表选择Excel第1列数据作为排序指标
* */
var dimension = 0;
/*参数说明:Y轴显示数量
* 默认显示10条数据
* */
var maxData = 10;
/*参数说明:柱图颜色数组
* 根据数据唯一名称数量总数调整个数
* */
var barColors = [
    '#C1232B', '#B5C334', '#FCCE10', '#E87C25', '#27727B',
    '#FE8463', '#9BCA63', '#FAD860', '#F3A43B', '#60C0DD',
    '#D7504B', '#C6E579', '#F4E001', '#F0805A', '#26C0C0',
    '#ff7f50', '#87cefa', '#da70d6', '#32cd32', '#6495ed',
    '#ff69b4', '#ba55d3', '#cd5c5c', '#ffa500', '#40e0d0',
    '#1e90ff', '#ff6347', '#7b68ee', '#00fa9a', '#ffd700',
    '#6b8e23', '#ff00ff', '#3cb371', '#b8860b', '#30e0e0'
];
/*参数说明:柱图文本标签显示位置
 *参数选项:
 'top'
 'left'
 'right'
 'bottom'
 'inside'
 'insideLeft'
 'insideRight'
 'insideTop'
 'insideBottom'
 'insideTopLeft'
 'insideBottomLeft'
 'insideTopRight'
 'insideBottomRight'
 */
var yPosition = 'insideRight';


核心图表

//构建容器并初始化DOM;
    var myChart = echarts.init(document.getElementById("container"));
    //获取数据并加载;
    $.when(
        $.getJSON('data/data.json')
    ).done(function (res) {
        //获取数据集;
        var data = res;
        //获取年份;
        var years = [];
        for (var i = 0; i < data.length; ++i) {
            if (years.length === 0 || years[years.length - 1] !== data[i][4]) {
                years.push(data[i][4]);
            }
        }
        //开始年份;
        var startIndex = 1;
        var startYear = years[startIndex];
        //图表配置项;
        var option = {
            title: {
                x: 'center',
                text: title,
                subtext: subtext,
                top: '2%',
                textStyle: {
                    fontSize: titleSize,
                    color: 'rgba(121,121,121, 0.9)'
                }
            },
            grid: {
                left: '5%',
                right: '5%',
                top: '15%',
                bottom: '10%',
                containLabel: true
            },
            xAxis: {
                max: 'dataMax',
                label: {
                    formatter: function (n) {
                        return Math.round(n);
                    }
                }
            },
            dataset: {
                source: data.slice(1).filter(function (d) {
                    return d[4] === startYear;
                })
            },
            yAxis: {
                type: 'category',
                inverse: true,
                max: maxData,//显示柱图数量
                axisLabel: {
                    show: true,
                    textStyle: {
                        fontSize: 14
                    },
                    formatter: function (value) {
                        return value;
                    }
                },
                animationDuration: 300,
                animationDurationUpdate: 300
            },
            series: [{
                realtimeSort: true,
                seriesLayoutBy: 'column',
                type: 'bar',
                itemStyle: {
                    color: function (param) {
                        return barColors[param.dataIndex] || '#5470c6';
                    }
                },
                encode: {
                    x: dimension,
                    y: 3
                },
                label: {
                    show: true,
                    precision: 1,
                    position: yPosition,//文本标签显示位置
                    valueAnimation: true,
                    fontFamily: 'monospace'
                }
            }],
            // Disable init animation.
            animationDuration: 0,
            animationDurationUpdate: updateFrequency,
            animationEasing: 'linear',
            animationEasingUpdate: 'linear',
            graphic: {
                elements: [{
                    type: 'text',
                    right: "5%",
                    bottom: "15%",
                    style: {
                        text: startYear,
                        font: 'bolder 80px monospace',
                        fill: 'rgba(100, 100, 100, 0.25)'
                    },
                    z: 100
                }]
            }
        };
        myChart.setOption(option);
        window.addEventListener("resize", function () {
            myChart.resize();
        });
        //循环数据;
        for (var i = startIndex; i < years.length - 1; ++i) {
            (function (i) {
                setTimeout(function () {
                    updateYear(years[i + 1]);
                }, (i - startIndex) * updateFrequency);
            })(i);
        }
        //更新年份;
        function updateYear(year) {
            var source = data.slice(1).filter(function (d) {
                return d[4] === year;
            });
            option.series[0].data = source;
            option.graphic.elements[0].style.text = year;
            myChart.setOption(option);
            window.addEventListener("resize", function () {
                myChart.resize();
            });
        }
    })


后台服务代码

# -*- coding: UTF-8 -*-  
# @Time : 2021-10-09 8:29 
# @File : start.py
# @Author : LockDataV
import xlrd
import os
import json
from http.server import HTTPServer, SimpleHTTPRequestHandler
import webbrowser
# 读取excel数据并将其转为js文件
filename = r'data/lockdata.xls'
# 判断文件是否存在
file_data = os.path.exists(filename)
if not file_data:
    print("系统默认data.xls表格文件不存在.")
else:
    print("系统获取到文件,处理中...")
    data = xlrd.open_workbook(filename)  # 文件名以及路径,如果路径或者文件名有中文给前面加一个r不转义。
    # 获取你要sheet的名称
    sheet_name = data.sheet_names()
    # 根据sheet索引或者名称获取sheet内容
    sheet = data.sheet_by_index(0)
    # 获取整行和整列的值(列表)
    rows = sheet.row_values(0)  # 获取第1行内容
    # 自定义数组
    tables = []
    data = {}
    for rown in range(sheet.nrows):
        array = [sheet.cell_value(rown, 0), sheet.cell_value(rown, 1), sheet.cell_value(rown, 2), sheet.cell_value(rown, 3), sheet.cell_value(rown, 4)]
        tables.append(array)
    # print(tables)
    # 转为JSON
    res = json.dumps(tables, ensure_ascii=False)
    print(res)
    # 生成对应的JSON数据文件
    content = '{}'.format(res)
    # 写入文件
    with open(r'data/data.json', 'w', encoding="utf-8") as f:
        f.write(content)
    print("数据转换完成..")
# 创建http server
class GetHttpServer(SimpleHTTPRequestHandler):
    protocol_version = "HTTP/1.0"
    server_version = "PSHS/0.1"
    sys_version = "Python/3.9.x"
    target = "./"  # 监听目录,配置项
    def do_get(self):
        SimpleHTTPRequestHandler.do_GET(self)
    def do_post(self):
        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 http_server():
    ip = "localhost"  # 监听IP,配置项
    port = 8800  # 监听端口,配置项
    index_url = "http://{}:{}/index.html".format(ip, port)  # 监听主页url,配置项
    server = HTTPServer((ip, port), GetHttpServer)
    try:
        # 弹出窗口
        webbrowser.open(index_url)
        # 输出信息
        print("服务器监听地址: ", index_url)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()
# 执行服务器脚本
http_server()


Excel数据结构

lockdatav Done!

相关实践学习
Github实时数据分析与可视化
基于Github Archive公开数据集,将项目、行为等20+种事件类型数据实时采集至Hologres进行分析,并搭建可视化大屏。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
3月前
|
JavaScript Java 测试技术
Java项目基于ssm+vue.js的网上手机销售系统附带文章和源代码设计说明文档ppt
Java项目基于ssm+vue.js的网上手机销售系统附带文章和源代码设计说明文档ppt
48 0
|
2月前
|
移动开发 前端开发 语音技术
WordPress轻拟物博客主题niRvana 4.5.3(自适应手机端)
WordPress轻拟物主题niRvana,设计上不再趋从于现有的扁平风,我认为是时候从极致的扁平稍微向拟物致敬了,因此采用了轻拟物的风格。niRvana 设计和样式更加新颖,一眼看上去就会被他吸引住,主题配色也非常舒服。而且它有两个功能特别有意思,一个是自动根据文章特色图片识别出图片的主色调,在首页、文章分类页用最美的方式显示滚动图片,另一个则是文章支持语音朗读。主题细腻有质感,手机端体验非常好。
51 2
|
2月前
【干货】手机投屏到电脑
【干货】手机投屏到电脑
27 1
|
6天前
Echarts——饼图折线图柱状图相互转换
Echarts——饼图折线图柱状图相互转换
26 0
|
2月前
|
PHP
驾校在线考试系统源码 手机+PC+平板自适应
Thinkphp在线考题源码 驾校在线考试系统 手机+PC+平板 自适应,机动车驾驶培训学校驾校类网站源码带手机端 运行环境:php+mysql
148 11
驾校在线考试系统源码 手机+PC+平板自适应
|
2月前
|
安全
手机kali终端,集成安全集成工具----使用arpspoof工具给电脑断网------断网,网络攻击手段
手机kali终端,集成安全集成工具----使用arpspoof工具给电脑断网------断网,网络攻击手段
|
1月前
|
缓存 数据可视化 前端开发
使用ECharts实现动态数据可视化的最佳实践
使用ECharts实现动态数据可视化的最佳实践
|
2月前
|
Web App开发 移动开发 编解码
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
本文讨论了实时数据传输在互联网中的重要性,如即时通讯和在线直播。一对一通信通常使用WebRTC技术,但一对多直播需要流媒体服务器和特定协议,如RTSP、RTMP、SRT或RIST。RTMP由于其稳定性和早期普及,成为国内直播的主流。文章通过实例演示了如何使用OBS Studio和RTMP Streamer进行RTMP推流,并对比了不同流媒体传输协议的优缺点。推荐了两本关于FFmpeg和Android开发的书籍以供深入学习。
38 0
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
|
1月前
|
前端开发
大屏自适应/适配方案【详解】(echarts自适配、rem、flexible.js、vscode中px2rem插件自动计算rem)
大屏自适应/适配方案【详解】(echarts自适配、rem、flexible.js、vscode中px2rem插件自动计算rem)
166 0
|
1月前
【详细流程】vue+Element UI项目中使用echarts绘制圆环图 折线图 饼图 柱状图
【详细流程】vue+Element UI项目中使用echarts绘制圆环图 折线图 饼图 柱状图
137 0