约20 x 20 x 20立方体的图密度

时间:2019-02-13 21:29:04

标签: python r

我正在寻找一种绘制密度图(使用Python或R)的好方法,该密度图显示模拟蛋白质定期探索的空间。数据集由许多5x5x5立方体内的密度组成,如下所示:

x      y    z    density
-4    -3    51    0 
-4    -3    56    0.523343
     ...
121    92    81    1 
121    92    86    0.01 

(x,y,z)表示3D坐标,它是立方体左下角的点。每个立方体的大小为5x5x5。两个立方体之间没有重叠。总共约有1万个立方体。

density列是我要分配给每个多维数据集的颜色。数字范围是0到1。

我也愿意接受其他绘图方法。任何意见,将不胜感激。

2 个答案:

答案 0 :(得分:2)

对于1万个立方体,我猜想plotly的mesh3d或3d曲面图(如@Jon Spring提到的)将需要大量计算。

我不确定这是否适合您,但我会选择像这样的散点图:

enter image description here

library(plotly)

n <- 100

cubes <- data.frame(
  x = rnorm(n, 0, 200),
  y = rnorm(n, 0, 200),
  z = rnorm(n, 0, 200),
  density = runif(n, 0, 1)
)

p <- plot_ly(cubes, x = ~x, y = ~y, z = ~z, color = ~density, type = "scatter3d", mode = "markers", colors = colorRamp(c("blue", "lightblue", "chartreuse3", "yellow", "red")), marker = list(symbol = 'square', size = 4))
p

# optional: save plot as a HTML file
library(htmlwidgets)
saveWidget(p, file="myScatter3dPlot.html", selfcontained = TRUE)

n增加到10k可以平稳运行。这里的缺点是,显示的符号是扁平正方形,给定的数据点(x,y,z)是其中心(您可以计算与左下角的偏移量)。另外,正方形大小和颜色可能需要根据您的用例进行调整。

请参阅其他信息herehere

答案 1 :(得分:1)

misc3d程序包中的功能(在OpenGL的rgl接口上构建)似乎很不错。

组成数据

在没有数据可玩的情况下,我使用了多元正常密度

dd <- expand.grid (x=1:21,y=1:21,z=1:21)
dd[,1:3] <- scale(dd[,1:3])
library(mvtnorm)
S <- matrix(c(0.5,0.1,-0.1,0.1,2,0.7,-0.1,0.7,1),3,3)
dd$dens <- dmvnorm(dd[,1:3],mean=c(0,0,0),sigma=S)

重塑数据

misc3d::image3d()需要3D阵列才能使用;使用reshape2::acast()来完成工作

library(reshape2)
v <- acast(dd,x~y~z, value.var="dens")

制作图片

library(viridisLite)  ## optional: prettier colour palette
library(misc3d)
## function to extract dim names for x, y, z axes
d <- function(i) as.numeric(dimnames(v)[[i]])
image3d(v,x=d(1),y=d(2),z=d(3),
        sprites=TRUE,  ## (default)
        col=viridis(256))
contour3d(v,x=d(1),y=d(2),z=d(3),level=c(0.01,0.03),
          alpha=0.2,add=TRUE)
box3d()
rgl.snapshot("dens3d.png")

我在拍摄快照时遇到了一些麻烦(可能是关于我的系统的事情),因此选择了截图。在旧版MacBook Pro上,渲染10,000点的速度有点,但效果还不错。您可以尝试颜色sprites=TRUEFALSE,轮廓...

enter image description here