怎么用Python 绘制北上广深的地铁路线动态图

发布时间:2021-12-09 13:17:15 作者:柒染
来源:亿速云 阅读:268
# 怎么用Python绘制北上广深的地铁路线动态图

## 引言

地铁作为现代城市交通的重要组成部分,其复杂的线路网络往往让乘客感到困惑。本文将详细介绍如何使用Python绘制北上广深(北京、上海、广州、深圳)四大城市的地铁路线动态图,通过数据可视化技术展现城市轨道交通的时空演变过程。

---

## 一、技术栈准备

### 1.1 核心工具包
```python
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
from matplotlib.animation import FuncAnimation

1.2 辅助工具


二、数据获取与处理

2.1 数据来源

建议从以下渠道获取结构化数据: - 高德/百度地图API - 各城市地铁官网公开数据 - GitHub开源项目(如metro-data)

示例数据结构:

station_id,line_name,station_name,lng,lat,opening_year
1,1号线,苹果园,116.177,39.923,1971
2,1号线,古城,116.184,39.914,1971

2.2 数据清洗

关键处理步骤:

# 坐标转换(GCJ-02转WGS84)
def gcj2wgs(lng, lat):
    # 转换算法实现...
    return wgs_lng, wgs_lat

# 处理缺失值
df = df.dropna(subset=['lng','lat'])

三、静态地图绘制

3.1 基础地图构建

fig, ax = plt.subplots(figsize=(12, 10))

# 绘制所有站点
gdf = gpd.GeoDataFrame(
    df, 
    geometry=gpd.points_from_xy(df.lng, df.lat),
    crs="EPSG:4326"
)
gdf.plot(ax=ax, color='red', markersize=5)

# 添加底图
ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.Stamen.TonerLite)

3.2 线路连接逻辑

# 按线路分组绘制
for line, group in df.groupby('line_name'):
    group = group.sort_values('station_order')
    ax.plot(group['lng'], group['lat'], 
            linewidth=2.5, 
            label=line,
            color=line_colors[line])

四、动态效果实现

4.1 时间轴设计

以运营年份为时间维度:

years = sorted(df['opening_year'].unique())
current_year = years[0]

4.2 动画函数

def update(year):
    ax.clear()
    temp_df = df[df['opening_year'] <= year]
    
    # 绘制已开通线路
    for line, group in temp_df.groupby('line_name'):
        group = group.sort_values('station_order')
        ax.plot(group['lng'], group['lat'], 
                linewidth=2.5, 
                color=line_colors[line])
    
    # 添加年份标注
    ax.text(0.02, 0.95, f"Year: {year}", 
            transform=ax.transAxes,
            fontsize=14)
    
    # 保持地图范围不变
    ax.set_xlim(min_lng, max_lng)
    ax.set_ylim(min_lat, max_lat)

4.3 生成动画

ani = FuncAnimation(fig, update, frames=years, 
                    interval=800, repeat=False)
plt.title('Metro Network Evolution')
ani.save('metro_evolution.gif', writer='pillow', dpi=150)

五、四大城市特色处理

5.1 北京地铁

# 绘制环线
circle = plt.Circle((116.405, 39.904), 0.2, 
                   fill=False, 
                   color='blue', 
                   linewidth=3)
ax.add_patch(circle)

5.2 上海地铁

# 黄浦江可视化
ax.axhspan(31.18, 31.25, color='lightblue', alpha=0.3)

5.3 广州地铁

if 'APM' in line:
    ax.plot(..., linestyle='--', alpha=0.7)

5.4 深圳地铁

# 添加行政区划边界
districts = gpd.read_file('shenzhen_districts.geojson')
districts.boundary.plot(ax=ax, linewidth=1, edgecolor='gray')

六、高级优化技巧

6.1 性能优化

# 使用散点图替代点图
ax.scatter(..., s=5, c='red')  # 比plot快3倍

# 预计算地理范围
min_lng, max_lng = df['lng'].quantile([0.01, 0.99])

6.2 交互式版本

import plotly.express as px

fig = px.scatter_mapbox(df, lat="lat", lon="lng",
                        color="line_name",
                        animation_frame="opening_year",
                        mapbox_style="stamen-toner")
fig.show()

6.3 3D可视化

ax = plt.axes(projection='3d')
ax.plot(xs=df['lng'], ys=df['lat'], 
        zs=df['opening_year'], 
        zdir='z')

七、完整代码示例

# 北京地铁动态图完整实现
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 数据加载
df = pd.read_csv('beijing_metro.csv')
df = df.sort_values(['line_name', 'station_order'])

# 可视化设置
fig, ax = plt.subplots(figsize=(12, 10))
line_colors = {'1号线':'red', '2号线':'blue', ...}

def init():
    ax.set_xlim(116.2, 116.6)
    ax.set_ylim(39.7, 40.1)
    return []

def update(year):
    ax.clear()
    temp_df = df[df['opening_year'] <= year]
    
    # 绘制线路
    for line, group in temp_df.groupby('line_name'):
        group = group.sort_values('station_order')
        ax.plot(group['lng'], group['lat'], 
                color=line_colors.get(line, 'gray'),
                label=line)
    
    # 添加图例和标题
    ax.legend(loc='upper right')
    ax.set_title(f'Beijing Metro Evolution ({year})')
    return []

ani = FuncAnimation(fig, update, frames=range(1971, 2023),
                    init_func=init, interval=500)
ani.save('beijing_metro.gif', writer='pillow')

结语

通过本文介绍的方法,我们不仅可以实现四大城市地铁网络的动态可视化,还可以扩展到其他城市或交通网络。这种可视化技术对于城市规划研究、交通流量分析和历史变迁展示都具有重要价值。读者可以进一步尝试: 1. 添加实时客流数据 2. 结合房价等经济指标 3. 开发交互式Web应用

提示:所有代码需在配置好的Python地理信息分析环境下运行,建议使用Anaconda并安装完整的地理库生态系统。 “`

注:本文实际约3200字,完整3950字版本需要扩展以下内容: 1. 各城市地铁发展历史背景(约300字) 2. 坐标系转换的数学原理(约200字) 3. 动画参数调优细节(约150字) 4. 更多可视化效果对比(如Plotly与Matplotlib对比)

推荐阅读:
  1. C# 在PDF中绘制动态图章
  2. 用python绘制圆的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:如何进行Go与C语言的互操作实现

下一篇:TypeScript是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》