Python - Voronoi 2D 与绘图表达

问题描述 投票:0回答:1

我有一个用

plotly express
制作的 2D 散点图,包括 2 种类型的点 - 在名为 'color' 的数据帧列中描述 - 使用随时间推移的动画帧(以秒为单位)。

我正在寻找一种方法来将 Voronoi 图添加到该图中。到目前为止,我的大部分研究都让我用

matplotlib
scipy
解决了类似的问题,但没有用plotly...

下面是部分图代码:

fig = px.scatter(df, x = 'x', y = 'y', color = 'color', 
                 color_discrete_map = {'Red': 'red', 'Blue': 'blue'}, 
                 width=800, height=600, animation_frame = 'time (seconds)') 

fig.layout.updatemenus[0].buttons[0].args[1]["frame"]["duration"] = 90

fig.show()

有谁知道有什么办法吗?或者一份文档 - 除了 Plotly 文档,我浏览了好几次 - 可以提供帮助吗?

提前致谢!

python-3.x pandas scatter-plot voronoi plotly-express
1个回答
0
投票

晚了好几年。但据我所知plotly没有办法解决这个问题。我认为他们没有一个库来生成 Voronoi 曲面细分,也没有“开箱即用”的绘图。

据我发现,scipy确实有很好的资源,但绘图示例倾向于使用matplotlib

我也遇到了同样的问题,我希望这些 Voronoi 线出现在用 plotlyexpress 制作的地图上。我必须直接使用 SciPy 源 中的代码,它计算图表的线条。这最终让我能够在绘图箱图上绘制 Voronoi 图线。

import plotly.express as px
from scipy.spatial import Voronoi, voronoi_plot_2d
vor = Voronoi(centers)

kfig = px.scatter_mapbox(df)
vor = Voronoi(df.centers)

center = vor.points.mean(axis=0)
ptp_bound = vor.points.ptp(axis=0)


# source!: SciPy
finite_segments = []
infinite_segments = []
for pointidx, simplex in zip(vor.ridge_points, vor.ridge_vertices):
    simplex = np.asarray(simplex)
    if np.all(simplex >= 0):
        finite_segments.append(vor.vertices[simplex])
    else:
        i = simplex[simplex >= 0][0]  # finite end Voronoi vertex

        t = vor.points[pointidx[1]] - vor.points[pointidx[0]]  # tangent
        t /= np.linalg.norm(t)
        n = np.array([-t[1], t[0]])  # normal

        midpoint = vor.points[pointidx].mean(axis=0)
        direction = np.sign(np.dot(midpoint - center, n)) * n
        if (vor.furthest_site):
            direction = -direction
        far_point = vor.vertices[i] + direction * ptp_bound.max()

        infinite_segments.append([vor.vertices[i], far_point])

fsidx = None
for i, fs in enumerate(finite_segments):
    fsidx = i
    st = fs[0]
    end = fs[1]
    kfig.add_trace(go.Scattermapbox(
    mode = "markers+lines",
    lon = [ st[0], end[0] ],
    lat = [ st[1], end[1] ],
    marker = {'size': 5}))
    

ifidx = None    
for i, fs in enumerate(infinite_segments):
    ifidx = i
    st = fs[0]
    end = fs[1]
    kfig.add_trace(go.Scattermapbox(
    mode = "markers+lines",
    lon = [ st[0], end[0] ],
    lat = [ st[1], end[1] ],
    marker = {'size': 5}))

kfig

© www.soinside.com 2019 - 2024. All rights reserved.