# RunningTrainsPlot
为研究人员与工程技术人员提供的可扩展、可交互的铁路可视化工具。
> **注意**: 本项目之前名为"RailwayTrainsVisualization",现已更名为"RunningTrainsPlot"以提供更简洁的名称。如果您之前使用的是旧版本,请使用新名称重新安装。
## 功能特点
- **列流图 (Column Flow Chart)**:铁路线路流量可视化
- **速度曲线 (Speed Curve)**:列车速度-距离/时间曲线可视化
- **循环运行图 (Cyclic Diagram)**:列车循环运行图可视化
- **股道占用图 (Track Occupation)**:列车股道占用可视化
- **客流OD图 (Passenger Flow OD Chart)**:站点间客流可视化
- **工具函数**:数据加载、预处理和可视化工具
## 安装与更新
### 初次安装
```bash
pip install RunningTrainsPlot
```
### 更新到最新版本
```bash
pip install --upgrade RunningTrainsPlot
```
> 注意:只有在发布新版本后才需要使用--upgrade选项更新。可以通过`from RunningTrainsPlot import __version__; print(__version__)`检查当前版本。
### 验证安装
安装完成后可运行以下简单测试验证功能:
```python
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
# 检查版本
from RunningTrainsPlot import __version__
print(f"当前版本: {__version__}")
# 导入所有模块
from RunningTrainsPlot import passenger_flow, column_flow, speed_curve
from RunningTrainsPlot import cyclic_diagram, track_occupation
# 测试股道占用图
base_time = datetime(2023, 1, 1, 8, 0)
data = pd.DataFrame({
'train_id': ['G201', 'D101', 'K105'],
'track': ['1股道', '2股道', '3股道'],
'arrival_time': [
base_time,
base_time + timedelta(hours=1),
base_time + timedelta(hours=2)
],
'departure_time': [
base_time + timedelta(hours=0.5),
base_time + timedelta(hours=2),
base_time + timedelta(hours=3)
]
})
# 创建股道占用图
fig, ax = track_occupation.plot_track_occupation(
data,
title='股道占用图测试',
figsize=(10, 6)
)
plt.show()
```
## 使用指南
### 列流图
```python
from RunningTrainsPlot import column_flow
# 加载数据
stations, flows = column_flow.load_flow_data("stations.csv", "flows.csv")
# 绘制图表
column_flow.plot_column_flow(stations, flows)
```
### 速度曲线
```python
from RunningTrainsPlot import speed_curve
# 加载数据
data = speed_curve.load_speed_data("speed_data.csv")
# 绘制速度-距离曲线
speed_curve.plot_speed_curve(data, x_col='distance', y_col='speed')
# 绘制速度-时间曲线
speed_curve.plot_speed_curve(data, x_col='time', y_col='speed')
# 同时绘制两种曲线
speed_curve.plot_speed_distance_time(data)
```
### 循环运行图
```python
from RunningTrainsPlot import cyclic_diagram
# 加载数据
data = cyclic_diagram.load_data("cycle_data.csv")
# 绘制图表
cyclic_diagram.plot_cyclic_diagram(data)
```
### 股道占用图
```python
from RunningTrainsPlot import track_occupation
# 加载数据
data = track_occupation.load_track_data("track_data.csv")
# 绘制股道占用图
track_occupation.plot_track_occupation(data)
```
### 客流OD图表
```python
from RunningTrainsPlot import passenger_flow
# 加载数据
data = passenger_flow.load_data("passenger_data.csv")
# 绘制图表
passenger_flow.plot_passenger_flow(data)
```
## 数据工具
```python
from RunningTrainsPlot import utils
# 加载数据
data = utils.load_data("data.csv")
# 预处理数据
processed_data = utils.preprocess_data(data)
```
## 版本历史
- **1.0.0** - 初始版本,从RailwayTrainsVisualization更名而来
- **1.0.1** - 新增原生循环运行图(cyclic_diagram)实现,不再依赖外部包
## 作者
- ZeyuShen <sc22zs2@leeds.ac.uk>
## 许可证
MIT
Raw data
{
"_id": null,
"home_page": "https://github.com/yourusername/RunningTrainsPlot",
"name": "RunningTrainsPlot",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "railway, train, visualization, plot, diagram, flow",
"author": "Shen-Zeyu,Guan-Chengze,Zheng-Haoyu,He-Zelin,Wu-Yuqian",
"author_email": "sc22zs2@leeds.ac.uk",
"download_url": "https://files.pythonhosted.org/packages/02/ed/23cb262726e3a7b4a7d52a02491d74197c0e49461282bed82bd13f3bc317/runningtrainsplot-1.0.7.tar.gz",
"platform": null,
"description": "# RunningTrainsPlot\r\n\r\n\u4e3a\u7814\u7a76\u4eba\u5458\u4e0e\u5de5\u7a0b\u6280\u672f\u4eba\u5458\u63d0\u4f9b\u7684\u53ef\u6269\u5c55\u3001\u53ef\u4ea4\u4e92\u7684\u94c1\u8def\u53ef\u89c6\u5316\u5de5\u5177\u3002\r\n\r\n> **\u6ce8\u610f**: \u672c\u9879\u76ee\u4e4b\u524d\u540d\u4e3a\"RailwayTrainsVisualization\"\uff0c\u73b0\u5df2\u66f4\u540d\u4e3a\"RunningTrainsPlot\"\u4ee5\u63d0\u4f9b\u66f4\u7b80\u6d01\u7684\u540d\u79f0\u3002\u5982\u679c\u60a8\u4e4b\u524d\u4f7f\u7528\u7684\u662f\u65e7\u7248\u672c\uff0c\u8bf7\u4f7f\u7528\u65b0\u540d\u79f0\u91cd\u65b0\u5b89\u88c5\u3002\r\n\r\n## \u529f\u80fd\u7279\u70b9\r\n\r\n- **\u5217\u6d41\u56fe (Column Flow Chart)**\uff1a\u94c1\u8def\u7ebf\u8def\u6d41\u91cf\u53ef\u89c6\u5316\r\n- **\u901f\u5ea6\u66f2\u7ebf (Speed Curve)**\uff1a\u5217\u8f66\u901f\u5ea6-\u8ddd\u79bb/\u65f6\u95f4\u66f2\u7ebf\u53ef\u89c6\u5316\r\n- **\u5faa\u73af\u8fd0\u884c\u56fe (Cyclic Diagram)**\uff1a\u5217\u8f66\u5faa\u73af\u8fd0\u884c\u56fe\u53ef\u89c6\u5316\r\n- **\u80a1\u9053\u5360\u7528\u56fe (Track Occupation)**\uff1a\u5217\u8f66\u80a1\u9053\u5360\u7528\u53ef\u89c6\u5316\r\n- **\u5ba2\u6d41OD\u56fe (Passenger Flow OD Chart)**\uff1a\u7ad9\u70b9\u95f4\u5ba2\u6d41\u53ef\u89c6\u5316\r\n- **\u5de5\u5177\u51fd\u6570**\uff1a\u6570\u636e\u52a0\u8f7d\u3001\u9884\u5904\u7406\u548c\u53ef\u89c6\u5316\u5de5\u5177\r\n\r\n## \u5b89\u88c5\u4e0e\u66f4\u65b0\r\n\r\n### \u521d\u6b21\u5b89\u88c5\r\n\r\n```bash\r\npip install RunningTrainsPlot\r\n```\r\n\r\n### \u66f4\u65b0\u5230\u6700\u65b0\u7248\u672c\r\n\r\n```bash\r\npip install --upgrade RunningTrainsPlot\r\n```\r\n\r\n> \u6ce8\u610f\uff1a\u53ea\u6709\u5728\u53d1\u5e03\u65b0\u7248\u672c\u540e\u624d\u9700\u8981\u4f7f\u7528--upgrade\u9009\u9879\u66f4\u65b0\u3002\u53ef\u4ee5\u901a\u8fc7`from RunningTrainsPlot import __version__; print(__version__)`\u68c0\u67e5\u5f53\u524d\u7248\u672c\u3002\r\n\r\n### \u9a8c\u8bc1\u5b89\u88c5\r\n\r\n\u5b89\u88c5\u5b8c\u6210\u540e\u53ef\u8fd0\u884c\u4ee5\u4e0b\u7b80\u5355\u6d4b\u8bd5\u9a8c\u8bc1\u529f\u80fd\uff1a\r\n\r\n```python\r\nimport pandas as pd\r\nimport matplotlib.pyplot as plt\r\nfrom datetime import datetime, timedelta\r\n\r\n# \u68c0\u67e5\u7248\u672c\r\nfrom RunningTrainsPlot import __version__\r\nprint(f\"\u5f53\u524d\u7248\u672c: {__version__}\")\r\n\r\n# \u5bfc\u5165\u6240\u6709\u6a21\u5757\r\nfrom RunningTrainsPlot import passenger_flow, column_flow, speed_curve\r\nfrom RunningTrainsPlot import cyclic_diagram, track_occupation\r\n\r\n# \u6d4b\u8bd5\u80a1\u9053\u5360\u7528\u56fe\r\nbase_time = datetime(2023, 1, 1, 8, 0)\r\ndata = pd.DataFrame({\r\n 'train_id': ['G201', 'D101', 'K105'],\r\n 'track': ['1\u80a1\u9053', '2\u80a1\u9053', '3\u80a1\u9053'],\r\n 'arrival_time': [\r\n base_time,\r\n base_time + timedelta(hours=1),\r\n base_time + timedelta(hours=2)\r\n ],\r\n 'departure_time': [\r\n base_time + timedelta(hours=0.5),\r\n base_time + timedelta(hours=2),\r\n base_time + timedelta(hours=3)\r\n ]\r\n})\r\n\r\n# \u521b\u5efa\u80a1\u9053\u5360\u7528\u56fe\r\nfig, ax = track_occupation.plot_track_occupation(\r\n data,\r\n title='\u80a1\u9053\u5360\u7528\u56fe\u6d4b\u8bd5',\r\n figsize=(10, 6)\r\n)\r\nplt.show()\r\n```\r\n\r\n## \u4f7f\u7528\u6307\u5357\r\n\r\n### \u5217\u6d41\u56fe\r\n\r\n```python\r\nfrom RunningTrainsPlot import column_flow\r\n\r\n# \u52a0\u8f7d\u6570\u636e\r\nstations, flows = column_flow.load_flow_data(\"stations.csv\", \"flows.csv\")\r\n\r\n# \u7ed8\u5236\u56fe\u8868\r\ncolumn_flow.plot_column_flow(stations, flows)\r\n```\r\n\r\n### \u901f\u5ea6\u66f2\u7ebf\r\n\r\n```python\r\nfrom RunningTrainsPlot import speed_curve\r\n\r\n# \u52a0\u8f7d\u6570\u636e\r\ndata = speed_curve.load_speed_data(\"speed_data.csv\")\r\n\r\n# \u7ed8\u5236\u901f\u5ea6-\u8ddd\u79bb\u66f2\u7ebf\r\nspeed_curve.plot_speed_curve(data, x_col='distance', y_col='speed')\r\n\r\n# \u7ed8\u5236\u901f\u5ea6-\u65f6\u95f4\u66f2\u7ebf\r\nspeed_curve.plot_speed_curve(data, x_col='time', y_col='speed')\r\n\r\n# \u540c\u65f6\u7ed8\u5236\u4e24\u79cd\u66f2\u7ebf\r\nspeed_curve.plot_speed_distance_time(data)\r\n```\r\n\r\n### \u5faa\u73af\u8fd0\u884c\u56fe\r\n\r\n```python\r\nfrom RunningTrainsPlot import cyclic_diagram\r\n\r\n# \u52a0\u8f7d\u6570\u636e\r\ndata = cyclic_diagram.load_data(\"cycle_data.csv\")\r\n\r\n# \u7ed8\u5236\u56fe\u8868\r\ncyclic_diagram.plot_cyclic_diagram(data)\r\n```\r\n\r\n### \u80a1\u9053\u5360\u7528\u56fe\r\n\r\n```python\r\nfrom RunningTrainsPlot import track_occupation\r\n\r\n# \u52a0\u8f7d\u6570\u636e\r\ndata = track_occupation.load_track_data(\"track_data.csv\")\r\n\r\n# \u7ed8\u5236\u80a1\u9053\u5360\u7528\u56fe\r\ntrack_occupation.plot_track_occupation(data)\r\n```\r\n\r\n### \u5ba2\u6d41OD\u56fe\u8868\r\n\r\n```python\r\nfrom RunningTrainsPlot import passenger_flow\r\n\r\n# \u52a0\u8f7d\u6570\u636e\r\ndata = passenger_flow.load_data(\"passenger_data.csv\")\r\n\r\n# \u7ed8\u5236\u56fe\u8868\r\npassenger_flow.plot_passenger_flow(data)\r\n```\r\n\r\n## \u6570\u636e\u5de5\u5177\r\n\r\n```python\r\nfrom RunningTrainsPlot import utils\r\n\r\n# \u52a0\u8f7d\u6570\u636e\r\ndata = utils.load_data(\"data.csv\")\r\n\r\n# \u9884\u5904\u7406\u6570\u636e\r\nprocessed_data = utils.preprocess_data(data)\r\n```\r\n\r\n## \u7248\u672c\u5386\u53f2\r\n\r\n- **1.0.0** - \u521d\u59cb\u7248\u672c\uff0c\u4eceRailwayTrainsVisualization\u66f4\u540d\u800c\u6765\r\n- **1.0.1** - \u65b0\u589e\u539f\u751f\u5faa\u73af\u8fd0\u884c\u56fe(cyclic_diagram)\u5b9e\u73b0\uff0c\u4e0d\u518d\u4f9d\u8d56\u5916\u90e8\u5305\r\n\r\n## \u4f5c\u8005\r\n\r\n- ZeyuShen <sc22zs2@leeds.ac.uk>\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\nMIT\r\n",
"bugtrack_url": null,
"license": null,
"summary": "\u94c1\u8def\u5217\u8f66\u8fd0\u884c\u6570\u636e\u53ef\u89c6\u5316\u5de5\u5177",
"version": "1.0.7",
"project_urls": {
"Homepage": "https://github.com/yourusername/RunningTrainsPlot"
},
"split_keywords": [
"railway",
" train",
" visualization",
" plot",
" diagram",
" flow"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7a1ab57577114c1a1ec5835482f97bbf16bdeb42395fa8bad726645859ab7a34",
"md5": "62b4b6dc6c170023f4fe3fe666496ba1",
"sha256": "8fd71c7c1c83e98cf45abdc42be1545afb6bf6801bf1af37b957611e0c978d10"
},
"downloads": -1,
"filename": "runningtrainsplot-1.0.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "62b4b6dc6c170023f4fe3fe666496ba1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 18662,
"upload_time": "2025-09-14T12:34:57",
"upload_time_iso_8601": "2025-09-14T12:34:57.489712Z",
"url": "https://files.pythonhosted.org/packages/7a/1a/b57577114c1a1ec5835482f97bbf16bdeb42395fa8bad726645859ab7a34/runningtrainsplot-1.0.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "02ed23cb262726e3a7b4a7d52a02491d74197c0e49461282bed82bd13f3bc317",
"md5": "d9fb040ccde5408baea1527186e6c9f9",
"sha256": "1190b8eda1faef998cc3167952282399c4b9053fbb7853311d975251038df328"
},
"downloads": -1,
"filename": "runningtrainsplot-1.0.7.tar.gz",
"has_sig": false,
"md5_digest": "d9fb040ccde5408baea1527186e6c9f9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 15154,
"upload_time": "2025-09-14T12:34:59",
"upload_time_iso_8601": "2025-09-14T12:34:59.270995Z",
"url": "https://files.pythonhosted.org/packages/02/ed/23cb262726e3a7b4a7d52a02491d74197c0e49461282bed82bd13f3bc317/runningtrainsplot-1.0.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-14 12:34:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yourusername",
"github_project": "RunningTrainsPlot",
"github_not_found": true,
"lcname": "runningtrainsplot"
}