2014-07-23 6 views
12

Vorrei fare quanto segueCome hanno solo ogni altro confine, in un persp

set.seed(1) 
x <- seq(-10, 10, length= 600) 
y <- x 
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } 
z <- outer(x, y, f) 
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue") 

Ma la rete è troppo sottile in modo che il confine domina (È possibile confermare che è davvero il confine e non l'illuminazione utilizzando border = NA si diventa blu):.

enter image description here

un modo per affrontare questo è ovviamente quello di utilizzare non così bella di una griglia (ad esempio se si cambia length = 600 per length= 50 sembra molto suppliche formica, ed è in realtà l'esempio in? persp). Ma voglio la stessa forma e liscia esattamente come questa griglia sottile. Semplicemente non voglio disegnare tutti i bordi, forse solo 1/5 di loro per esempio (o la metà che presumo di poter personalizzare).

risposta

9

Un problema con tracciando la forma liscia e poi tracciare una griglia sopra la parte superiore di esso è che si può vedere attraverso la forma alla griglia sul lato opposto. Per risolvere questo problema, puoi iniziare a tracciare la griglia del corso su un oggetto bianco, il che significa che non puoi vedere il retro della griglia, salvando il risultato in un file.

x <- seq(-10, 10, length=50) 
y <- x 
z <- outer(x, y, f) 
png("top.png") 
print(persp(x, y, z, theta = 30, phi = 30, expand = 0.5, border="black", col="white")) 
dev.off() 

enter image description here

Quindi, è possibile tracciare levigata immagine seguita dalla griglia con tutti i colori bianchi completamente trasparenti.

x <- seq(-10, 10, length= 600) 
y <- x 
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } 
z <- outer(x, y, f) 
png("bottom.png") 
print(persp(x, y, z, theta = 30, phi = 30, expand = 0.5, border="lightblue", col="lightblue")) 
dev.off() 

par(oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0)) 
library(png) 
top.img <- readPNG("top.png") 
top.img[,,4][top.img[,,1] + top.img[,,2] + top.img[,,3] > 2] <- 0 

plot.new() 
rasterImage(bottom.img, 0, 0, 1, 1) 
rasterImage(top.img, 0, 0, 1, 1) 

enter image description here

+0

Penso che questo potrebbe essere la soluzione migliore. Ero troppo tardi per assegnare la taglia. E 'stato premiato automaticamente. Inoltre ho bisogno di studiare tutte le soluzioni di più. Grazie mille. –

8

Ho due soluzioni, ma penso che entrambe non siano esattamente quello che state cercando. Faccio una sovrapposizione di linea, ma non viene sovrapposta alla superficie.

set.seed(1) 
x <- seq(-10, 10, length= 600) 
y <- x 
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } 
z <- outer(x, y, f) 
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", border=NA, shade=0.75, ticktype = "detailed") 

par(new=T) 

set.seed(1) 
x <- seq(-10, 10, length=20) 
y <- x 
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } 
z <- outer(x, y, f) 
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = NA, border="green") 

cornered line overlay

set.seed(1) 
x <- seq(-10, 10, length= 600) 
y <- x 
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } 
z <- outer(x, y, f) 
res <- persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", border=NA, shade=0.75, ticktype = "detailed") 

library(grDevices) 
xlines <- seq(1, length(x), length.out=20) 
for(line in xlines){ 
    lines (trans3d(x=x[line], y = y, z = z[line, ], pmat = res), col = 3, lwd=2) 
} 

ylines <- seq(1, length(y), length.out=20) 
for(line in ylines){ 
    lines (trans3d(x=x, y = y[line], z = z[,line], pmat = res), col = 3, lwd=2) 
} 

curved overlay

8

Qui ci sono due approcci, nessuno dei quali non sono ideali. È possibile utilizzare AN per forzare "linee" trasparenti sulla superficie (Metodo 1) o utilizzare AN per eliminare tutti ma i "griglia" (Metodo 2)

Approccio 1:

z2 <- z 
lin.seq<- seq(10, 600, 10) 
z2[lin.seq,] <- NA 
z2[,lin.seq] <- NA 
persp(x, y, z2, theta = 30, phi = 30, expand = 0.5, 
     border=NA, col="lightblue", box=TRUE) 

enter image description here

È possibile tracciare quindi overlay sopra su una superficie nera solida:

# using original example data 
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "black", border=NA) 

par(new=TRUE) 
z2 <- z 
lin.seq<- seq(10, 600, 10) 
z2[lin.seq,] <- NA 
z2[,lin.seq] <- NA 
persp(x, y, z2, theta = 30, phi = 30, expand = 0.5, 
     border=NA, col="lightblue", box=FALSE) 

enter image description here

Approccio 2:

# using original example data 
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", border=NA) 

z3 <- matrix(ncol=600, nrow=600)    # NA matrix 
lin.seq <- seq(25, 600, 25)     # spacing of "grid lines" 
lin.seq <- c(lin.seq, lin.seq-1, lin.seq-2) # to make lines a bit thicker 

# replace some NAs on "grid lines" with values from z.  
z3[lin.seq,] <- z[lin.seq,] 
z3[,lin.seq] <- z[,lin.seq] 

par(new=TRUE) 
persp(x, y, z3, theta = 30, phi = 30, expand = 0.5, 
     border=NA, col="black", box=FALSE) 

enter image description here

Problemi correlati