2016-12-04 35 views
1

我正在使用rgl包在3d中绘制线段。我想根据未被绘制的数据框中的值对线段进行颜色编码。我可以让线条变成彩色,但是每个线段似乎都是颜色的渐变。我怎样才能使每个细分市场一个纯色?此外,行不是基于我尝试使用的数据框中的值着色。我的函数适用于散点图,但我担心它无法很好地转换为细分。我的代码与我的测试数据一起发布如下。如何根据rgl中的数据框中的值对线段进行着色?

library("rgl") 
library("rglwidget") 

zz <- " 
sequence x y z x2 y2 z2 col 
a 1 5 1 100 1000 2 4 
b 2 4 1 200 900 2 3 
c 2 4 1 300 800 2 2 
d 2 4 1 400 700 2 1 
e 3 3 1 500 600 2 0 
f 3 3 1 600 500 2 -1 
g 4 2 1 700 400 2 -2 
h 4 2 1 800 300 2 -3 
I 4 2 1 900 200 2 -4 
j 5 1 1 1000 100 2 -5" 


data <- read.table(text=zz, header=TRUE) 

w <- names(data[8]) 

gradient <- colorRampPalette(c("red", "orange", "yellow", "green", "blue", "violet")) 

v <- gradient(10)[as.numeric(cut(data[[w]], breaks=10))] 

segments3d(x=as.vector(t(log(data[,c(2,5)]))), 
     y=as.vector(t(data[,c(4,7)])), 
     z=as.vector(t(log(data[,c(3,6)]))), 
     axes=FALSE, col=v, plot=TRUE) 

rgl.bbox(color="grey50", emission="grey50", 
    xat = log(10^((-1):6)), yat = c(1, 2, 3, 4), zat = log(10^((-1):6)), xlab=10^((-1):6), ylab = (1:4), zlab=10^((-1):6)) 

aspect3d(1,1,1) 

回答

2

在任何情况下,你有更好的更新rgl(功能在rglwidget包已经被转移到rgl)。 rgl通过“点”控制一条线的颜色。所以你需要给每行两次颜色。

x = as.vector(t(log(data[,c(2,5)]))) 
y = as.vector(t(data[,c(4,7)])) 
z = as.vector(t(log(data[,c(3,6)]))) 
ind <- seq(2, 20, 2) 

segments3d(x, y, z, axes = FALSE, col = rep(v, each = 2)) 
texts3d(x[ind], y[ind], z[ind], texts = data$sequence, col = v) 
axes3d(xat = log(10^((-1):6)), yat = c(1, 2, 3, 4), zat = log(10^((-1):6)), 
     xlab = 10^((-1):6), ylab = (1:4), zlab = 10^((-1):6)) 
aspect3d(1, 1, 1) 

enter image description here

+0

真棒!非常感谢。在此代码的另一个版本中,我使用rglwidget,因为我使用WebGL来创建带有图形的网页。 – arprater

+1

你不需要'rglwidget'包,它已经被合并到'rgl'中。 – user2554330

相关问题