Plotly:绘制多边形

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

我有一些点(

X0, Y0
),它们定义了一个多边形。
X0, Y0
是一维数组。 与
plotly

 polygon = go.Scatter(
        x=X0,
        y=Y0,
        showlegend=False,
        mode="lines",
        fill="toself",
        line=dict(color="LightSeaGreen", width=2),
        )  

结果看起来不符合预期,所以我想我需要先以某种方式对点进行排序。

知道我该怎么做吗?

(请忽略红点。)

python plotly
3个回答
1
投票

问题是按照你的观点的顺序排列的。我用相同的点做了一个例子,但以不同的方式组织它们(数组中的不同位置)。

fig = make_subplots(1,3, subplot_titles=("polygon0", "polygon1", "polygon2"))

X0 = [25, 50, 38, 40]
Y0 = [20, 40, 60, 25]

X1 = [25, 38, 50, 40]
Y1 = [20, 60, 40, 25]

X2 = [25, 38, 50, 40, 25]
Y2 = [20, 60, 40, 25, 20]


polygon0 = go.Scatter(
        x=X0,
        y=Y0,
        showlegend=False,
        mode="lines",
        fill='toself',
        line=dict(color="LightSeaGreen", width=2)
        )  

polygon1 = go.Scatter(
        x=X1,
        y=Y1,
        showlegend=False,
        mode="lines",
        fill='toself',
        line=dict(color="LightSeaGreen", width=2)
        )  

polygon2 = go.Scatter(
        x=X2,
        y=Y2,
        showlegend=False,
        mode="lines",
        fill='toself',
        line=dict(color="LightSeaGreen", width=2)
        )  

fig.add_trace(polygon0, row=1, col=1)
fig.add_trace(polygon1, row=1, col=2)
fig.add_trace(polygon2, row=1, col=3)
fig.update_xaxes(range=[20, 55])
fig.show()

如图所示,多边形 0 和多边形 1 非常不同,尽管它们是由相同的散点构成的。数组中唯一的区别是数组 X1 Y1 中的点 2-(50, 40) 和 3-(38, 60) 发生了变化,(2 变为 3,3 变为 2)。

最后,如果您想闭合多边形,您可以在数组中添加一个额外的点,相当于点 0 (polygon2)。


1
投票

添加来自@Tengis的答案使用shapely,您可以构造多点几何图形并从中构造凸包。那么在 plotly

中使用就很简单了
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import shapely.geometry
import numpy as np

fig = make_subplots(1, 2, subplot_titles=("polygon0", "convex hull"))

X0 = [25, 50, 38, 40]
Y0 = [20, 40, 60, 25]

# 2D array of points that make up convex hull
convex_hull = np.array(
    shapely.geometry.MultiPoint(
        [xy for xy in zip(X0, Y0)]
    ).convex_hull.exterior.coords
)

polygon0 = go.Scatter(
    x=X0,
    y=Y0,
    showlegend=False,
    mode="lines",
    fill="toself",
    line=dict(color="LightSeaGreen", width=2),
)

polygon1 = go.Scatter(
    x=convex_hull[:, 0],
    y=convex_hull[:, 1],
    showlegend=False,
    mode="lines",
    fill="toself",
    line=dict(color="LightSeaGreen", width=2),
)

fig.add_trace(polygon0, row=1, col=1)
fig.add_trace(polygon1, row=1, col=2)
fig.update_xaxes(range=[20, 55])
fig.show()


0
投票

有一个使用 Plotly 绘制 Shapely 几何图形(包括多边形)的项目

它支持所有 Shapely 几何图形、2D 和 3D 绘图,以及对颜色、线条、标记和填充的控制。

重复@Rob Raymond的示例:

import shapely_plotly
import shapely

X0 = [25, 50, 38, 40]
Y0 = [20, 40, 60, 25]

poly0 = shapely.Polygon(shell=zip(X0,Y0))
# Get convex hull
poly1 = poly0.convex_hull

plot_data0 = []
poly0.plotly_draw2d(plot_data0)
shapely_plotly.show2d(plot_data0)

plot_data1 = []
poly1.plotly_draw2d(plot_data1)
shapely_plotly.show2d(plot_data1)

Original polygon

Convex Hull

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