绘图3D图具有正确的纵横比

发布于 2025-01-26 08:05:53 字数 2050 浏览 4 评论 0 原文

相关帖子在这里:

为了进一步改进,我想知道如何根据垃圾箱尺寸绘制容器框架,因此该图可以更清楚地显示剩下多少备用空间,当容器不满时剩下多少?就像如下所示:

”在此处输入图像说明“

upadte:绘制外部容器框架

def parallelipipedic_frame(xm, xM, ym, yM, zm, zM):
    # defines the coords of each segment followed by None, if the line is
    # discontinuous
    x = [xm, xM, xM, xm, xm, None, xm, xM, xM, xm, xm, None, xm, xm, None, xM, xM,
         None, xM, xM, None, xm, xm]
    y = [ym, ym, yM, yM, ym, None, ym, ym, yM, yM, ym, None, ym, ym, None, ym, ym,
         None, yM, yM, None, yM, yM]
    z = [zm, zm, zm, zm, zm, None, zM, zM, zM, zM, zM, None, zm, zM, None, zm, zM,
         None, zm, zM, None, zm, zM]
    return x, y, z

x, y, z = parallelipipedic_frame(0, 1202.4, 0, 235, 0, 269.7)
# fig = go.Figure(go.Scatter3d(x=x, y=y, z=z, mode="lines", line_width=4))

fig.add_trace(
    go.Scatter3d(
        x=x,
        y=y,
        z=z,
        mode="lines",
        line_color="blue",
        line_width=2,
        hoverinfo="skip",
    )
)

ar = 4
xr = max(d["x"].max()) - min(d["x"].min())
fig.update_layout(
    title={"text": pbin, "y": 0.9, "x": 0.5, "xanchor": "center", "yanchor": "top"},
    margin={"l": 0, "r": 0, "t": 0, "b": 0},
    # autosize=False,
    scene=dict(
        camera=dict(eye=dict(x=2, y=2, z=2)),
        aspectratio={
            **{"x": ar},
            **{
                c: ((max(d[c].max()) - min(d[c].min())) / xr) * ar
                for c in list("yz")
            },
        },
        aspectmode="manual",
    ),
)

“

the relevant post is here: interactive 3D plot with right aspect ratio using plotly

For a further improvment, I am wondering how to plot a container frame according to the bin size, so the graph can display more clearly how much spare space is left, when container is not full? just like what is shown below:

enter image description here

UPADTE: drawing outer container frame

def parallelipipedic_frame(xm, xM, ym, yM, zm, zM):
    # defines the coords of each segment followed by None, if the line is
    # discontinuous
    x = [xm, xM, xM, xm, xm, None, xm, xM, xM, xm, xm, None, xm, xm, None, xM, xM,
         None, xM, xM, None, xm, xm]
    y = [ym, ym, yM, yM, ym, None, ym, ym, yM, yM, ym, None, ym, ym, None, ym, ym,
         None, yM, yM, None, yM, yM]
    z = [zm, zm, zm, zm, zm, None, zM, zM, zM, zM, zM, None, zm, zM, None, zm, zM,
         None, zm, zM, None, zm, zM]
    return x, y, z

x, y, z = parallelipipedic_frame(0, 1202.4, 0, 235, 0, 269.7)
# fig = go.Figure(go.Scatter3d(x=x, y=y, z=z, mode="lines", line_width=4))

fig.add_trace(
    go.Scatter3d(
        x=x,
        y=y,
        z=z,
        mode="lines",
        line_color="blue",
        line_width=2,
        hoverinfo="skip",
    )
)

ar = 4
xr = max(d["x"].max()) - min(d["x"].min())
fig.update_layout(
    title={"text": pbin, "y": 0.9, "x": 0.5, "xanchor": "center", "yanchor": "top"},
    margin={"l": 0, "r": 0, "t": 0, "b": 0},
    # autosize=False,
    scene=dict(
        camera=dict(eye=dict(x=2, y=2, z=2)),
        aspectratio={
            **{"x": ar},
            **{
                c: ((max(d[c].max()) - min(d[c].min())) / xr) * ar
                for c in list("yz")
            },
        },
        aspectmode="manual",
    ),
)

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

追星践月 2025-02-02 08:05:53

框架由段组成,并在两个点之间绘制一个段。因此,我不能仅根据您的长度,宽度和高度提供plottin框架的代码。
我需要并联的顶点的坐标,iexmin(),x.max(),y.min(),y.max(),等等(请参见上文),表示xm,xm,xm,ym,ym,ym,ym,ym,zm,zm:

import plotly.graph_objects as go

def parallelipipedic_frame(xm, xM, ym, yM, zm, zM):
    #defines the coords of each segment followed by None, if the line is 
    discontinuous
    x = [xm, xM, xM, xm, xm, None, xm, xM, xM, xm, xm, None, xm, xm, None, xM, xM, 
         None, xM, xM, None, xm, xm]
    y = [ym, ym, yM, yM, ym, None, ym, ym, yM, yM, ym, None, ym, ym, None, ym, ym, 
         None, yM, yM,None, yM, yM]
    z= [zm, zm, zm, zm, zm, None, zM, zM, zM, zM, zM, None, zm, zM, None, zm, zM, 
        None, zm, zM, None, zm, zM]
    return x, y, z

x, y, z= parallelipipedic_frame(2.3, 4.5, 0,5, 0, 2)
fig=go.Figure(go.Scatter3d(x=x, y=y, z=z, mode="lines", line_width=4))
fig.update_layout(width=600, height=450, font_size=11,  scene_aspectmode="data", 
                  scene_camera_eye=dict (x=1.45, y=1.45, z=1), template="none")
fig.show()

The frame consists of segments, and a segment is drawn between two points. Hence I cannot give the code for plottin the frame only from your length, width and height.
I need the coordinates of the parallelipiped vertices, i.e. x.min(), x.max(), y.min(), y.max(), etc (see above), denoted xm, xM, ym, yM, zm, zM:

import plotly.graph_objects as go

def parallelipipedic_frame(xm, xM, ym, yM, zm, zM):
    #defines the coords of each segment followed by None, if the line is 
    discontinuous
    x = [xm, xM, xM, xm, xm, None, xm, xM, xM, xm, xm, None, xm, xm, None, xM, xM, 
         None, xM, xM, None, xm, xm]
    y = [ym, ym, yM, yM, ym, None, ym, ym, yM, yM, ym, None, ym, ym, None, ym, ym, 
         None, yM, yM,None, yM, yM]
    z= [zm, zm, zm, zm, zm, None, zM, zM, zM, zM, zM, None, zm, zM, None, zm, zM, 
        None, zm, zM, None, zm, zM]
    return x, y, z

x, y, z= parallelipipedic_frame(2.3, 4.5, 0,5, 0, 2)
fig=go.Figure(go.Scatter3d(x=x, y=y, z=z, mode="lines", line_width=4))
fig.update_layout(width=600, height=450, font_size=11,  scene_aspectmode="data", 
                  scene_camera_eye=dict (x=1.45, y=1.45, z=1), template="none")
fig.show()

enter image description here

停滞 2025-02-02 08:05:53

要获取现实的3D图,您应该在布局中设置 caset_aspectMode ='data'

要绘制容器框架,请从用于绘制体素的数据中检索 x.min(),x.max(),y.min(),y.max(),z.min(),z。 max(),如果x,y,z是数组或min(x)等如果它们为列表。然后添加到您的情节中,可以查找一个散点图图, mode =“ lines” 以绘制容器框架的线路。我检查了它的部分框架,该框架附在我自己的Voxel图上,它有效:

To get a realistic 3d plot, you should set in layout, scene_aspectmode='data'.

To plot the container frame, retrieve from data used to plot the voxels, x.min(), x.max(), y.min(), y.max(), z.min(), z.max(), if x, y, z are arrays or min(x) etc if they are lists. Then add to your plotly figure a scatter3d plot, mode="lines" to draw the lines for container frame. I checked it for a partial frame attached to my own voxel plot, and it works:
voxels

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文