2

我正在尝试在 R 中创建模拟树根的 3D 图。这是一个根系统随时间增长的示例:

图 1

这本质上是一个 3D 圆柱网络,其中圆柱直径(以及可选的颜色)表示根的大小。可用数据包括:

  • 根质心的 x, y, z
  • “父”根的方向(例如 +x、-x、+y、-y、+z、-z),尽管可以通过几种不同的方式捕获此信息,包括通过计算父级的 x、y、z直接在绘图之前。
  • 根的大小

示例 3D 数据在这里,但这是我第一次尝试在 2D 中使用ggplot2::geom_spoke

dat <- data.frame(x = c(0,1,-1,0,1,-1),
              y = c(-1,-1,-1,-2,-2,-2),
              biomass = c(3,1.5,1.5,1,1,1), 
              parent.dir = c("+y","-x","+x","+y","+y","+y"))
dat$parent.dir <- as.numeric(as.character(factor(dat$parent.dir, 
                                             levels = c("-x", "+x", "-y", "+y"),
                                             labels = c(pi, 0, pi*3/2, pi/2)))) 

ggplot(dat, aes(x = x, y = y)) +
  geom_point(x = 0, y = 0, size = 20) +
  geom_spoke(radius = 1,
         aes(angle = parent.dir,
             size  = biomass)) + 
  coord_equal()

在此处输入图像描述

我更喜欢基于ggplot2框架的解决方案,但我意识到ggplot2. ggraph一种有趣的方法可能是通过和tidygraph包创造性地利用网络图的概念。据我所知,虽然这些包仅在 2D 中运行,但他们的开发人员也有一些有趣的 3D 相关想法,也可以应用。

中的rgl库似乎是 R 中 3D 绘图的首选,但rgl解决方案似乎要复杂得多,并且缺乏 的其他好处ggplot2,例如示例中的按年份分面,轻松调整比例等。

示例数据在这里:

4

1 回答 1

1

我不了解您的数据格式,所以我确定这不是您想要的显示,但它显示了如何在以下位置绘制一堆圆柱体rgl

root <- read.csv("~/temp/root.csv")
segments <- data.frame(row.names = unique(root$parent.direction),
                       x = c(-1,0,1,0,0),
                       y = c(0,1,0,0,-1),
                       z = c(0,0,0,0.2,0))
library(rgl)
open3d()
for (i in seq_len(nrow(root))) {
        rbind(root[i,2:4], 
              root[i,2:4] - segments[root$parent.direction[i],]) %>%
        cylinder3d(radius = root$size[i]^0.3, closed = -2, sides = 20) %>%
        shade3d(col = "green")
}
decorate3d() 

这给出了以下显示(原始可旋转):

很多缸

addNormals如果你想让它看起来光滑,你可以通过每个圆柱体,或者使用sides = <some big number>cylinder3d使它们看起来更圆。

于 2018-02-26T11:27:50.687 回答