Я хотел бы построить план этажа в 3D, но моя попытка создает трассировки для каждой линии, что не является необходимым и приводит к задержке при построении планов этажа с большим количеством строк. Есть ли способ построить план этажа в 3D, используя одну трассировку?
План этажа после простого plot_ly()
звонка:
Используя аргумент сюжета split
:
Без split
:
Файл .dxf находится в этом репозитории.
library(tidyverse)
library(plotly)
library(shiny)
library(reactable)
library(sf)
library(lwgeom)
library(bslib)
dxf <- st_read("https://raw.githubusercontent.com/asadow/linestring-select/main/giraffe360_demo_residential.dxf")
dxf_gp <- dxf |>
group_by(geometry_type = st_geometry_type(dxf)) |>
nest()
dxf_lns <- dxf_gp |>
filter(geometry_type == "LINESTRING") |>
unnest(cols = c(data)) |>
mutate(
geometry = st_zm(geometry, "LINESTRING"),
ini = st_startpoint(geometry),
end = st_endpoint(geometry)
)
dxf_lns <- dxf_lns |>
mutate(
across(
c(ini, end),
list(
x = \(point) st_coordinates(point)[,1],
y = \(point) st_coordinates(point)[,2]
),
.names = "{.fn}{.col}"
)
) |>
st_as_sf()
df <- dxf_lns |>
st_coordinates() |>
as_tibble() |>
mutate(Z = 0)
df |>
plot_ly(type = "scatter3d", mode = "lines",
x = ~X, y = ~Y, z = ~Z, split = ~L1,
line = list(color = '#1f77b4', width = 1))
Для многих трассировок разделение приводит к замедлению взаимодействия с графиками, даже если легенда отключена.
Вы можете использовать group_by()
или отключить легенду при использовании split
:
df |>
group_by(L1) |>
plot_ly(type = "scatter3d", mode = "lines",
x = ~X, y = ~Y, z = ~Z,
line = list(color = '#1f77b4', width = 1))
df |>
plot_ly(type = "scatter3d", mode = "lines",
x = ~X, y = ~Y, z = ~Z, split = ~L1,
line = list(color = '#1f77b4', width = 1),
showlegend = F)
group_by()
делает свое дело (один след). И я вижу, что это описано в главе 3 книги Карсона.
В чем проблема
split
? что в легенде показаны множественные следы? Если да, то вы можете отключить легенду.