2014-07-23 6 views
12

Ich magWie nur jede zweite Grenze in einem 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") 

nach dem würde zu tun hat, aber das Gitter zu dünn ist, so dass die Grenze dominiert (Sie können es bestätigen ist in der Tat die Grenze und nicht die Beleuchtung von border = NA mit es wird blau).

enter image description here

eine Möglichkeit, dies zu adressieren ist natürlich nicht so fein ein Gitter zu verwenden (zum Beispiel, wenn Sie length = 600 zu length= 50 es sehr Bitten sieht ändern ant, und ist eigentlich das Beispiel in? persp). Aber ich will die gleiche Form und glatt wie dieses feine Gitter. Ich möchte einfach nicht alle Ränder zeichnen, vielleicht nur 1/5 von ihnen (oder die Hälfte, die ich anpassen kann).

Antwort

9

Ein Problem mit der glatten Form aufgetragen und dann ein Gitter über oben drauf Plotten ist, dass man durch die Form an das Netz auf der anderen Seite zu sehen. Um dieses Problem zu lösen, können Sie zunächst das Kursraster über einem weißen Objekt zeichnen, dh Sie können die Rückseite des Gitters nicht sehen und das Ergebnis in einer Datei speichern.

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

Dann können Sie durch das Raster gefolgt Bild mit allen weißen Farben vollständig transparent Grundstück geglättet.

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

Ich denke, dies ist die beste Lösung sein könnte. Ich war zu spät, um Kopfgeld zu vergeben. Es wurde automatisch vergeben. Außerdem muss ich alle Lösungen mehr studieren. Vielen Dank. –

8

Ich habe zwei Lösungen, aber ich denke, dass beide nicht genau das sind, wonach Sie suchen. Ich mache ein Linien-Overlay, aber es wird nicht von der Oberfläche überlappt.

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

Hier sind zwei Ansätze, von denen keines sind nicht ideal. Sie können nas Mit transparent „Linien“ auf die Oberfläche zu zwingen (Ansatz 1) oder NAS verwenden, um alle, aber die „Gitterlinien“ (Ansatz 2)

Ansatz 1 loszuwerden:

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

Sie können dann Overlay-Plot oben auf einem festen schwarzen Oberfläche:

# 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

Ansatz:

# 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

Verwandte Themen