gpt4 book ai didi

r - 使用 ggplot2 和plotly 绘制 3D 棱镜

转载 作者:行者123 更新时间:2023-12-02 10:52:40 32 4
gpt4 key购买 nike

我有一个包含三个矩阵的列表a和一个具有三个高度(任何正实数)的向量h。这些矩阵形成三角形,即棱柱的底面。我想添加向量h的信息来构造棱镜。

我创建了一个以 2D 形式绘制图形的函数 (pplot)。如何绘制如下图所示的棱镜?

pplot 和一个玩具问题为例:

library(ggplot2)
pplot <- function(polygon){
polygon <- lapply(polygon, function(x) {colnames(x) <- NULL; x})
vertex_number = nrow(polygon[[1]])
g = ggplot2::ggplot()
names(polygon) = 1:length(polygon)
k <- plyr::ldply(polygon, function(x) data.frame(x))
g <- ggplot2::ggplot(k, ggplot2::aes(x = X1, y = X2, group = .id)) + ggplot2::geom_polygon(colour = "black", fill = NA)
return(g)
}

a <- list()
b1 <- matrix(rnorm(6), ncol = 2)
b2 <- matrix(rnorm(6), ncol = 2)
b3 <- matrix(rnorm(6), ncol = 2)

a[[1]] <- b1
a[[2]] <- b2
a[[3]] <- b3

h <- c(.3, .5, .1)
#pplot function example
pplot(a)

需要图形

An example desired

其中坐标a = db = fc = e是顶点,所有信息都在a<中.

观察 1:数据必须是一个列表。

观察 2:我用葡萄牙语创建了一个帖子,但没有人回复。我可以这样做还是这是作弊? (我是新来的) https://pt.stackoverflow.com/questions/165538/plotar-figuras-3d-para-dados-em-lista

最佳答案

我不能 100% 确定我正确理解了该任务。不过,这里有一个使用 rgl 包的解决方案草案。在我看来,它仍然是最好的 R 3D 绘图框架,因为它比 javascript API(plotly、r Threejs 等)更快且可扩展性更好。

#### load package rgl ####
library(rgl)

set.seed(1232)

#### construct test list with coordinate matrices ####
a <- list()
b1 <- matrix(rnorm(6), ncol = 2)
b2 <- matrix(rnorm(6), ncol = 2)
b3 <- matrix(rnorm(6), ncol = 2)

a[[1]] <- b1
a[[2]] <- b2
a[[3]] <- b3

#### define test height vector ####
h <- c(.3, .5, .1)

#### simple plot prism function ####
# a: list with coordinate matrices
# h: height vector
plotprism <- function(a, h){
# general loop to plot every prism
for(i in 1:length(h)){
# transform matrizes to data.frames and add height column
# -> separation of top and bottom triangle
top <- data.frame(a[[i]], h[i])
bottom <- data.frame(a[[i]], 0)
# adjust colnames to axis names
colnames(top) <- c("x", "y", "z")
colnames(bottom) <- c("x", "y", "z")
# plot triangles (as wireframes)
triangles3d(bottom, front = "line", back = "line")
triangles3d(top, front = "line", back = "line")
# plot vertical lines to connect the triangles
for(i in 0:2){
segments3d(
x = c(bottom$x[1+i], top$x[1+i]),
y = c(bottom$y[1+i], top$y[1+i]),
z = c(bottom$z[1+i], top$z[1+i])
)
}
}
#### add coordinate system ####
axes3d()
}

#### call plot function for test data ####
plotprism(a, h)

结果: enter image description here

关于r - 使用 ggplot2 和plotly 绘制 3D 棱镜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40614888/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com