2016-06-08 22 views
9

Zastanawiam się nad możliwością wygładzenia fabuły lub poprawy jej jakości, ponieważ teraz piksele są zbyt duże.Gładka powierzchnia 2D

library(ggplot2) 
    library(reshape2) 

    # plot2d = melt(c) 
    plot2d = melt(matrix(rnorm(20), 5)) # fake data 

    names(plot2d) <- c("x", "y", "z") 

    v <- ggplot(plot2d, aes(x, y, z = z)) 
      v + geom_tile(aes(fill = z)) + 
       scale_alpha_continuous(limits=c(start.point, end.point)) + 
       scale_fill_gradient2('TYYYT',low="green", mid = "white", high="red") 

enter image description here

+0

Mało powtarzalne bez danych. Niektóre fałszywe dane również byłyby bardzo proste w tym przypadku. –

+0

Oczywistym sposobem jest interpolacja danych. Jeśli podałeś jakieś fałszywe dane, wyobrażam sobie, że ktoś by sobie z tym poradził. –

+0

Dodałem fałszywe dane –

Odpowiedz

7
library(ggplot2) 
library(reshape2) 

set.seed(101) 
## set dimnames so that melt() picks them up 
m <- matrix(rnorm(20),5,dimnames=list(x=1:5,y=1:4)) 

plot2d_1 <- melt(m,value.name="z") 

gg0 <- ggplot(plot2d_1, aes(x,y,z=z,fill=z)) 

enter image description here

Najprostszym sposobem wygładzania to wykres jest użycie geom_raster() z interpolate=TRUE (patrz ?geom_tile dla innych zalet).

gg0 + geom_raster(interpolate=TRUE) 

enter image description here

Można również zrobić (dwuliniowy) interpolacji ręcznie, przy użyciu pakietu fields (istnieje wiele możliwości: np. library(sos); findFn("{bilinear interpolation}")

library(fields) 
m2 <- interp.surface.grid(list(x=1:5,y=1:4,z=m), 
       grid.list=list(x=seq(1,5,length=101), 
          y=seq(1,4,length=101))) 
dimnames(m2$z) <- list(x=m2$x,y=m2$y) 

Teraz topić je i Replot:

plot2d_2 <- melt(m2,value.name="z") 
gg0 %+% plot2d_2 + geom_tile()  

enter image description here

Hmm, interpolacja wydaje się zmieniły Z skalę - należy być ostrożnym z tym ...