您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用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
建议从以下渠道获取结构化数据: - 高德/百度地图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
关键处理步骤:
# 坐标转换(GCJ-02转WGS84)
def gcj2wgs(lng, lat):
# 转换算法实现...
return wgs_lng, wgs_lat
# 处理缺失值
df = df.dropna(subset=['lng','lat'])
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)
# 按线路分组绘制
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])
以运营年份为时间维度:
years = sorted(df['opening_year'].unique())
current_year = years[0]
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)
ani = FuncAnimation(fig, update, frames=years,
interval=800, repeat=False)
plt.title('Metro Network Evolution')
ani.save('metro_evolution.gif', writer='pillow', dpi=150)
# 绘制环线
circle = plt.Circle((116.405, 39.904), 0.2,
fill=False,
color='blue',
linewidth=3)
ax.add_patch(circle)
# 黄浦江可视化
ax.axhspan(31.18, 31.25, color='lightblue', alpha=0.3)
if 'APM' in line:
ax.plot(..., linestyle='--', alpha=0.7)
# 添加行政区划边界
districts = gpd.read_file('shenzhen_districts.geojson')
districts.boundary.plot(ax=ax, linewidth=1, edgecolor='gray')
# 使用散点图替代点图
ax.scatter(..., s=5, c='red') # 比plot快3倍
# 预计算地理范围
min_lng, max_lng = df['lng'].quantile([0.01, 0.99])
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()
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对比)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。