简体   繁体   English

使用ggplot2和plotly绘制3D棱镜

[英]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 = db = fc = 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)

The results: 结果: 在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM