2010-09-24 48 views
6

Bạn có thể cho tôi một ví dụ về cách sử dụng rgl để vẽ 3 biến tại các trục x, y và z và một biến thứ tư với các màu khác nhau không?R: Âm mưu 4D, x, y, z, màu sắc

cảm ơn

+0

'raster :: plot3D' sử dụng 'rgl'. Tôi đã tạo hình ảnh của dữ liệu ví dụ tại đây: http://stackoverflow.com/questions/5220283/surface-plot-in-r-similar-to-the-one-from-gnuplot –

Trả lời

5

Bạn sử dụng kết hợp persp và màu theo chức năng riêng biệt. Dưới đây là một số mã ví dụ:

## Create a simple surface f(x,y) = -x^2 - y^2 
## Colour the surface according to x^2 only 
nx = 31; ny = 31 
x = seq(-1, 1, length = nx) 
y = seq(-1, 1, length = ny) 
z = outer(x, y, function(x,y) -x^2 -y^2) 
## Fourth dim 
z_col = outer(x, y, function(x,y) x^2) 

## Average the values at the corner of each facet 
## and scale to a value in [0, 1]. We will use this 
## to select a gray for colouring the facet. 
hgt = 0.25 * (z_col[-nx,-ny] + z_col[-1,-ny] + z_col[-nx,-1] + z_col[-1,-1]) 
hgt = (hgt - min(hgt))/ (max(hgt) - min(hgt)) 

## Plot the surface with the specified facet colours. 
persp(x, y, z, col = gray(1 - hgt)) 
persp(x, y, z, col=cm.colors(32)[floor(31*hgt+1)], theta=-35, phi=10) 

Điều này cho phép:

Sample output

RGL

Đó là khá đơn giản để sử dụng các kỹ thuật nói trên với thư viện RGL:

library(rgl) 
## Generate the data using the above commands 
## New window 
open3d() 

## clear scene: 
clear3d("all") 

## setup env: 
bg3d(color="#887777") 
light3d() 

surface3d(x, y, z, color=cm.colors(32)[floor(31*hgt+1)], alpha=0.5) 
+0

Một 5 năm quá muộn bình luận: 'cm.colors (31) [floor (31 * hgt + 1)]' sẽ đưa ra một số giá trị giới hạn (NA) vì 'hgt' có thể là 1. Bạn có thể có nghĩa là' cm. màu sắc (32) [sàn (31 * hgt + 1)] '? – YuppieNetworking

+0

@YuppieNetworking Cảm ơn và cố định. – csgillespie

0

Hãy xem example(points3d).

Trang trợ giúp r3d cho bạn biết cách vẽ các trục.

x <- c(0, 10, 0, 0) 
y <- c(0, 0, 100, 0) 
z <- c(0, 0, 0, 1) 
i <- c(1,2,1,3,1,4) 
labels <- c("Origin", "X", "Y", "Z") 
text3d(x,y,z,labels) 
segments3d(x[i],y[i],z[i]) 

Bây giờ bạn có thêm một số điểm

dfr <- data.frame(x = 1:10, y = (1:10)^2, z = runif(10), col = rainbow(10)) 
with(dfr, points3d(x, y, z, col = col)) 
+0

Tôi không nhận được bất kỳ kết quả với mã của bạn – skan

+0

@ user425895: Bạn sẽ thấy 3 trục có gắn nhãn và một số điểm. Kiểm tra xem bạn có thể hiển thị * mọi thứ * với 'rgl' không. Sau đó kiểm tra xem bạn đã sao chép và dán chính xác chưa. –

2

Có một ví dụ trong plot3d nếu bạn đang nói về âm mưu điểm trong một không gian 3d và tô màu chúng:

x <- sort(rnorm(1000)) 
y <- rnorm(1000) 
z <- rnorm(1000) + atan2(x,y) 
plot3d(x, y, z, col=rainbow(1000)) 

Nhưng nếu ý bạn là tô màu các điểm theo biến số 4, nói biến nhóm, sau đó chúng ta có thể sửa đổi ví dụ trên để thực hiện việc này bằng cách tạo biến nhóm

grp <- gl(5, 200) ## 5 groups 200 members each 
## now select the colours we want 
cols <- 1:5 

## Now plot 
plot3d(x, y, z, col=cols[grp]) 

OK, đây có phải là điều bạn muốn nữa không?

X <- 1:10 
Y <- 1:10 
## Z is now a 100 row object of X,Y combinations 
Z <- expand.grid(X = X, Y = Y) 
## Add in Z1, which is the 3rd variable 
## X,Y,Z1 define the surface, which we colour according to 
## 4th variable Z2 
Z <- within(Z, { 
    Z1 <- 1.2 + (1.4 * X) + (-1.9 * Y) 
    Z2 <- 1.2 + (1.4 * X) - (1.2 * X^2) + (1.9 * Y) + (-1.3 * Y^2) 
    Z3 <- 1.2 + (1.4 * X) + (-1.9 * Y) + (-X^2) + (-Y^2)}) 
## show the data 
head(Z) 
## Set-up the rgl device 
with(Z, plot3d(X, Y, Z1, type = "n")) 
## Need a scale for Z2 to display as colours 
## Here I choose 10 equally spaced colours from a palette 
cols <- heat.colors(10) 
## Break Z2 into 10 equal regions 
cuts <- with(Z, cut(Z2, breaks = 10)) 
## Add in the surface, colouring by Z2 
with(Z, surface3d(1:10,1:10, matrix(Z1, ncol = 10), 
        color = cols[cuts], back = "fill")) 
with(Z, points3d(X, Y, Z1, size = 5)) ## show grid X,Y,Z1 

Đây là sửa đổi khi mặt phẳng Z1 bị cong (Z3).

## Set-up the rgl device plotting Z3, a curved surface 
with(Z, plot3d(X, Y, Z3, type = "n")) 
with(Z, surface3d(1:10,1:10, matrix(Z3, ncol = 10), 
        color = cols[cuts], back = "fill")) 

Các chi tiết về những gì tôi đã làm để có được Z2 có lẽ không quan trọng, nhưng tôi đã cố gắng để có được một cái gì đó giống như đồ thị, bạn liên kết đến.

Nếu tôi vẫn chưa có những gì bạn muốn, bạn có thể chỉnh sửa câu hỏi của mình với một số dữ liệu mẫu và cung cấp cho chúng tôi ý tưởng tốt hơn về những gì bạn muốn không?

HTH

+0

một cái gì đó như thế này. http://addictedtor.free.fr/graphiques/graphcode.php?graph=90 nhưng đó là một chút bối rối – skan

+0

@ user425895: Tôi đã chỉnh sửa câu trả lời của mình để cố gắng lấy nội dung giống như biểu đồ bạn đã liên kết.Nỗ lực này có giống như những gì bạn muốn không? –

+0

Xin chào, dòng cuối cùng không hoạt động, nó cho biết không tìm thấy Z2. – skan

Các vấn đề liên quan