plotly.graph_objects 的替代品,用于绘制二维线(python 或 js)

Alternatives to plotly.graph_objects for plotting 2D lines (python or js)

我目前正在尝试绘制具有从地图 api 到汇总图的连接边的经纬度点。我目前正在使用 plotly 从 python 执行此操作,但我的问题是水平轴 'zooms' 或拉伸,如记录 here resulting in something like this:

任何人都可以在 js 或 python 中推荐一个 2D 矢量绘图库来完成这个而不用拉伸吗?

我使用了 NetworkX 和 matplotlib.pyplot 库。

  • 您对数据的定义非常抽象。因此,我使用了简单易用的 osmnx,它提供了源节点和边的简单方法
  • edges 将是 LineStringplotly 想要一个经纬度列表,因此提取 co-ordinates 并展平
  • 已经证明
    1. 线迹,显然这是拉伸的(如预期的那样),因为它没有考虑线性 space
    2. 上的几何投影
    3. line mapbox trace

获取一些点和连接的边

import osmnx as ox
import plotly.express as px
import numpy as np

# get some edges
gdf = ox.geocode_to_gdf('Topsham, Devon')
G = ox.graph_from_polygon(gdf.loc[0,"geometry"], network_type='drive')
gdf_nodes, gdf_edges = ox.graph_to_gdfs(G)

情节线

  • 这些被拉伸了
# plotly lines are arrays of points with each line separated by None
px.line(
    x=np.concatenate(
        gdf_edges["geometry"].apply(lambda g: [c[1] for c in g.coords] + [None]).values
    ),
    y=np.concatenate(
        gdf_edges["geometry"].apply(lambda g: [c[0] for c in g.coords] + [None]).values
    ),
)

plotly mapbox

  • 无拉伸
px.line_mapbox(
    lat=np.concatenate(
        gdf_edges["geometry"].apply(lambda g: [c[1] for c in g.coords] + [None]).values
    ),
    lon=np.concatenate(
        gdf_edges["geometry"].apply(lambda g: [c[0] for c in g.coords] + [None]).values
    ),
).update_layout(mapbox={"style":"carto-positron", "zoom":13})

folium(使用 geopandas)

gdf_edges.explore()