[英]Plot density for ~20 x 20 x 20 cubes
我正在尋找一種繪制密度圖(使用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。
我也願意接受其他繪圖方法。 任何意見,將不勝感激。
對於10k多維數據集,我猜想plotly的mesh3d或3d表面圖(如@Jon Spring所述)在計算上會非常密集。
我不確定這是否是您的選擇,但我會使用這樣的scatter3d圖:
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)是其中心(您可以計算與左下角的偏移量)。 另外,正方形大小和顏色可能需要根據您的用例進行調整。
misc3d
軟件包(基於OpenGL的rgl
接口構建)中的功能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
vs FALSE
,輪廓...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.