Python绘制数据地图-MovingPandas

发布于:2025-01-22 ⋅ 阅读:(9) ⋅ 点赞:(0)

MovingPandas 是一个用于时空数据分析的 Python 库,它扩展了 Pandas 和 GeoPandas,使得处理和分析带有时间戳的地理数据变得更加方便。虽然 MovingPandas 本身不直接提供数据可视化功能,但你可以结合其他库如 matplotlibfoliumplotly 来绘制数据地图。

以下是一个简单的示例,展示如何使用 MovingPandasmatplotlib 来绘制带有时间戳的地理数据地图:

  1. 安装必要的库

    pip install movingpandas geopandas matplotlib pandas
    
  2. 导入库并准备数据

    import pandas as pd
    import geopandas as gpd
    from movingpandas import TrajectoryCollection, Trajectory
    import matplotlib.pyplot as plt
    
    # 示例数据:创建一些带有时间戳的地理数据点
    data = {
        'timestamp': ['2023-10-01 00:00:00', '2023-10-01 01:00:00', '2023-10-01 02:00:00',
                      '2023-10-01 00:00:00', '2023-10-01 01:00:00', '2023-10-01 02:00:00'],
        'geometry': [
            'POINT (1 1)', 'POINT (2 2)', 'POINT (3 3)',
            'POINT (4 4)', 'POINT (5 5)', 'POINT (6 6)'
        ]
    }
    df = pd.DataFrame(data)
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.geometry.apply(lambda x: float(x.split()[1])),
                                                          df.geometry.apply(lambda x: float(x.split()[0]))))
    
    # 创建轨迹对象
    trajectories = [Trajectory(gdf[gdf['geometry'] == f'POINT ({x} {y})'].copy().reset_index(drop=True))
                    for x, y in zip([1, 4], [1, 4])]
    tc = TrajectoryCollection(trajectories)
    
  3. 绘制地图
    由于 MovingPandas 本身不提供绘图功能,我们可以使用 GeoPandas 的绘图功能来可视化地理数据。这里我们绘制每个时间点的位置。

    # 绘制所有轨迹点
    fig, ax = plt.subplots(1, 1, figsize=(10, 6))
    
    for trajectory in tc.trajectories:
        for point in trajectory.df.itertuples(index=False, name=None):
            plt.plot(point.geometry.x, point.geometry.y, 'bo')  # 'bo' 表示蓝色圆点
    
    # 设置坐标轴范围和标签
    plt.xlim(0, 7)
    plt.ylim(0, 7)
    plt.xlabel('Longitude')
    plt.ylabel('Latitude')
    plt.title('Trajectory Points')
    plt.grid(True)
    plt.show()
    

请注意,这个示例非常基础,只是简单地绘制了每个时间点的位置。如果你需要更复杂的时空数据可视化,比如动态地图或轨迹动画,可以考虑使用 foliumplotly

例如,使用 plotly 绘制动态轨迹:

import plotly.express as px

# 将轨迹数据转换为适合 plotly 的格式
plotly_data = []
for trajectory in tc.trajectories:
    plotly_data.append(trajectory.df[['geometry', 'timestamp']].rename(columns={'geometry': 'geometry (lat, lon)'}))

# 由于 plotly 不直接支持 GeoPandas 的 geometry 列,我们需要将其转换为经纬度列
for df in plotly_data:
    df['lat'] = df['geometry (lat, lon)'].apply(lambda x: float(x.y))
    df['lon'] = df['geometry (lat, lon)'].apply(lambda x: float(x.x))
    df.drop(columns=['geometry (lat, lon)'], inplace=True)

# 合并轨迹数据
plotly_data = pd.concat(plotly_data).reset_index(drop=True)

# 使用 plotly 绘制
fig = px.scatter_geo(plotly_data, lat='lat', lon='lon', color='index', hover_name='timestamp',
                     animation_frame='timestamp', title='Trajectory Animation')
fig.show()

这个 plotly 示例需要安装 plotly 库,并且它展示了如何创建带有时间动画的轨迹地图。你可以根据需要调整这些代码。