соответствующий пост находится здесь: интерактивный 3D-график с правильным соотношением сторон с использованием plotly
Для дальнейшего улучшения мне интересно, как построить рамку контейнера в соответствии с размером корзины, чтобы график мог более четко отображать, сколько свободного места осталось, когда контейнер не заполнен? точно так же, как показано ниже:
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",
),
)
Чтобы получить реалистичный 3D-сюжет, вы должны установить в макете scene_aspectmode='data'
.
Чтобы построить кадр контейнера, извлеките данные, используемые для построения вокселей, x.min(), x.max(), y.min(), y.max(), z.min(), z.max()
, если x, y, z являются массивами или min(x) и т. д., если они являются списками. Затем добавьте к вашей сюжетной фигуре график рассеяния mode = "lines"
, чтобы нарисовать линии для рамки контейнера. Я проверил его на частичный кадр, прикрепленный к моему собственному воксельному графику, и он работает:
контейнер 40HC: длина ширина и высота 1202,4, 235, 269,7. не могли бы вы предоставить код для построения границы контейнера?
Кадр состоит из сегментов, и между двумя точками рисуется сегмент. Следовательно, я не могу дать код для построения кадра только по вашей длине, ширине и высоте. Мне нужны координаты вершин параллелепипеда, т.е. x.min(), x.max(), y.min(), y.max() и т. д. (см. выше), обозначаемые 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()
что вы подразумеваете под "параллелепипедными вершинами". как интегрироваться с моими существующими кодами?мои полные коды здесь: stackoverflow.com/questions/71318810/…
есть функция о координатах x,y,z, это то, что вы ищете? def vertices(xmin=0, ymin=0, zmin=0, xmax=1, ymax=1, zmax=1): return { "x": [xmin, xmin, xmax, xmax, xmin, xmin, xmax, xmax ], "y": [ymin, ymax, ymax, ymin, ymin, ymax, ymax, ymin], "z": [zmin, zmin, zmin, zmin, zmax, zmax, zmax, zmax], "i": [7, 0, 0, 0, 4, 4, 6, 1, 4, 0, 3, 6], "j": [3, 4, 1, 2, 5, 6, 5, 2, 0, 1 , 6, 3], «к»: [0, 7, 2, 3, 6, 7, 1, 6, 5, 5, 7, 2], }
Да, xm, xM, ym, yM, zm, zM — это x.min(), x.max() и т. д. для массивов x, y, z, которые передаются в go.Mesh3d.
У меня все еще есть некоторые проблемы, которые я не могу построить правильно. не могли бы вы взглянуть на полные коды здесь и как сделать настройку: stackoverflow.com/questions/71318810/…
Построить такую рамку — задача элементарной геометрии. В моей системе не установлен matplotlib.
я могу нарисовать внешнюю рамку контейнера (см. мое редактирование), но график смещен влево, как расположить график в центре. как удалить верхнюю правую строку трассировки?
Я использую сюжет, так как вы можете обратиться к полным кодам в ответе здесь: stackoverflow.com/questions/71318810/… Я просто добавляю код (в моем обновлении выше), но график смещается влево. как сделать график центральным и не показывать линию трассировки.
Благодарю. помимо коробок внутри, как нарисовать рамку контейнера, как показано на графике выше.