我正在寻找一种绘制密度图(使用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。
我也愿意接受其他绘图方法。任何意见,将不胜感激。
答案 0 :(得分:2)
对于1万个立方体,我猜想plotly的mesh3d或3d曲面图(如@Jon Spring提到的)将需要大量计算。
我不确定这是否适合您,但我会选择像这样的散点图:
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)是其中心(您可以计算与左下角的偏移量)。另外,正方形大小和颜色可能需要根据您的用例进行调整。
答案 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=TRUE
与FALSE
,轮廓...