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
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
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:
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)
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
@YuppieNetworking Cảm ơn và cố định. – csgillespie
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))
Tôi không nhận được bất kỳ kết quả với mã của bạn – skan
@ 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. –
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
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
@ 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? –
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
'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 –