[英]Plot 3D prisms using ggplot2 and plotly
I have a list a
with three matrices and a vector h
with three heights (any positive real number). 我有一个列表
a
有三个矩阵和一个矢量h
有三个高度(任何正实数)。 These matrices form triangles, that is, the base of the prism. 这些矩阵形成三角形,即棱镜的基底。 I want to add the information of vector
h
to construct prisms. 我想添加矢量
h
的信息来构造棱镜。
I've created a function to plot graphics in 2D ( pplot
). 我创建了一个在2D(
pplot
)中绘制图形的函数。 How can I plot the prisms as in the figure below? 如何绘制棱镜,如下图所示?
Let pplot
and a toy problem be an example: 让
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)
Graphic desired 图形需要
Where the coordinate a = d
, b = f
, c = e
are vertices and all information is in a
. 坐标
a = d
, b = f
, c = e
是顶点,所有信息都在a
。
Observation 1: The data must a list. 观察1:数据必须列表。
Observation 2: I've created a post in portuguese, but nobody answered. 观察2:我用葡萄牙语创建了一个帖子,但没有人回答。 Can I do this or it is cheating?
我可以这样做还是作弊? (I'm new here) https://pt.stackoverflow.com/questions/165538/plotar-figuras-3d-para-dados-em-lista
(我是新来的) https://pt.stackoverflow.com/questions/165538/plotar-figuras-3d-para-dados-em-lista
I'm not 100% sure I understood the task correctly. 我不是100%确定我正确地理解了这个任务。 Nevertheless here's a draft for a solution with the package
rgl
. 不过这里是一个包
rgl
解决方案的草案。 In my opinion it's still the best 3D plotting framework for R, because it's much faster and scales better than the javascript APIs (plotly, rthreejs etc.). 在我看来,它仍然是R的最佳3D绘图框架,因为它比javascript API(plotly,rthreejs等)更快且扩展性更好。
#### 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.