来源:AI开发日志公众号专辑「Build Your Own X With AI」
原文链接:https://mp.weixin.qq.com/s?__biz=MzUxMjg3MjE2OA==&mid=2247486115&idx=1&sn=19d39508befa3ad80b88bf7c16a6b8a7&chksm=f95c9124ce2b183281f4e008fad6c82e793b82db6e79c0d89e80d9164d55d35a609919c81e67#rd

中国高铁出行人数排行榜

一个动态的条形图竞赛排行榜可视化系统,用于展示中国高铁出行人数随时间的变化趋势。

功能特性

🎬 动态动画 - 平滑的排名变化和数值增长动画

🎨 精美设计 - 深色/浅色主题,渐变色条形图,城市天际线背景

🎮 交互控制 - 播放/暂停/重置,速度调节,时间轴拖动

📊 数据可视化 - 清晰的排名、图标、名称和数值展示

📱 响应式设计 - 适配桌面、平板和手机设备

💾 数据导出 - 支持导出PNG图片和CSV数据

🖥️ 全屏模式 - 沉浸式观看体验

快速开始

  1. 克隆或下载项目

git clone https://github.com/build-your-own-x-with-ai/china-railway-ranking

cd china-railway-ranking

  1. 启动本地服务器

由于浏览器的CORS限制,需要使用本地服务器运行项目。

使用Python:

Python 3

python -m http.server 8000

Python 2

python -m SimpleHTTPServer 8000

使用Node.js:

npx http-server -p 8000

  1. 在浏览器中打开

访问 http://localhost:8000 即可查看排行榜。

数据源选择:

默认显示: 高铁站客流量排行(按月,2024年1月-2025年11月)

切换数据: 点击页面顶部的按钮切换不同数据源

高铁站排行(按月): 23个月数据

高铁线路排行(按季度): 23个季度数据

深圳地铁排行(按日): 15天数据

或直接访问:

http://localhost:8000?data=stations

(高铁站数据)

http://localhost:8000?data=lines

(高铁线路数据)

http://localhost:8000?data=metro

(深圳地铁数据)

项目结构

china-railway-ranking/

├── index.html              # 主页面

├── src/

│   ├── css/

│   │   └── style.css      # 样式文件

│   ├── js/

│   │   ├── DataManager.js      # 数据管理器

│   │   ├── AnimationEngine.js  # 动画引擎

│   │   ├── Renderer.js         # Canvas渲染器

│   │   ├── Controller.js       # 控制器

│   │   └── main.js            # 应用入口

│   └── data/

│       └── sample-data.json   # 示例数据

├── assets/

│   └── icons/             # 图标文件(可选)

└── README.md

数据格式

数据文件使用JSON格式,结构如下:

{

“title”:”中国高铁出行人数排行榜”,

“timeUnit”:”quarter”,

“frames”:[

{

“date”:”2020-Q1”,

“label”:”2020年第1季度”,

“data”:[

{

“id”:”beijing-shanghai”,

“name”:”京沪线”,

“value”:2927862,

“icon”:”/assets/icons/beijing-shanghai.png”,

“color”:”#00d4ff”

}

]

}

]

}

字段说明

title

排行榜标题

timeUnit

时间单位(如”month”, “quarter”, “year”)

frames

时间帧数组

id

唯一标识符(必需)

name

显示名称(必需)

value

数值(必需)

color

条形图颜色,十六进制格式(必需)

icon

图标路径(可选)

date

日期标识符

label

显示的时间标签

data

该时间帧的数据项数组

自定义数据

  1. 创建数据文件

在 src/data/ 目录下创建新的JSON文件,按照上述格式填写数据。

  1. 修改数据源

编辑 src/js/main.js,修改数据文件路径:

controller.init(‘src/data/your-data.json’);

  1. 准备图标(可选)

如果使用图标,将图标文件放在 assets/icons/ 目录下,并在数据中引用正确的路径。

使用说明

控制按钮

播放/暂停

控制动画的播放和暂停

重置

将动画重置到第一帧

速度

调整播放速度(0.5x, 1x, 2x)

时间轴

拖动滑块跳转到指定时间帧

高级功能

主题切换

点击月亮图标切换深色/浅色主题

全屏模式

点击全屏图标进入全屏观看

导出

点击导出图标可以导出PNG图片或CSV数据

浏览器兼容性

Chrome 90+

Firefox 88+

Safari 14+

Edge 90+

技术栈

HTML5 Canvas

  • 图形渲染

原生JavaScript

  • 核心逻辑

CSS3

  • 样式和动画

性能优化

使用requestAnimationFrame实现流畅的60fps动画

Canvas高DPI屏幕适配

图标预加载和缓存

高效的插值算法

常见问题

Q: 为什么在本地打开HTML文件无法加载数据?

A: 由于浏览器的CORS安全策略,需要使用本地服务器运行项目。请参考”快速开始”部分。

Q: 如何修改动画速度?

A: 可以通过界面上的速度按钮调整,或者修改 AnimationEngine 的配置参数。

Q: 支持多少个数据项?

A: 理论上没有限制,但建议每帧显示10-20个数据项以获得最佳视觉效果。

Q: 可以使用实时数据吗?

A: 可以。修改 DataManager 的 loadData 方法以支持从API获取数据,并实现数据更新机制。

许可证

MIT License

贡献

欢迎提交Issue和Pull Request!

Made with ❤️ for data visualization

image-1

image-2

image-3