/ / Jak zrobić wykres analogowy z ggplot2 do siatki: fill.contour ()? - r, ggplot2, krata

Jak utworzyć analogowy wykres fabuły ggplot2 do siatki: filled.contour ()? - r, ggplot2, krata

Uczyłem się ggplot2 i mam nadzieję, że z niego skorzystamdla wszystkich moich grafów R. Jednakże, muszę jeszcze znaleźć sposób na utworzenie wykresu konturu, który wygląda analogicznie do konwencjonalnego wykresu konturu, na przykład co można uzyskać za pomocą siatki: filled.contour (). Na przykład:

#define data
x<-seq(1,11,1)
y<-seq(1,11,1)
xyz.func<-function(x,y) {-10.4+6.53*x+6.53*y-0.167*x^2-0.167*y^2+0.0500*x*y}

#contour plot using lattice graphics and R Color Brewer
library(lattice) #for filled.contour()
library(RColorBrewer) #for brewer.pal()
z.lattice<-outer(x,y,xyz.func)
filled.contour(x,y,z.lattice,nlevels=6,col=brewer.pal(6,"YlOrRd"))

Daje mi to ładną linię konturu.

wprowadź opis obrazu tutaj

Teraz, spróbujmy tego samego w ggplot2. Najlepsze, co mogę wymyślić, oparte na wszystkim, co przeczytałem (szczególnie Rysowanie etykiet na płaskim przekroju warstwic w ggplot2) jest:

#contour plot using ggplot2
library(ggplot2)
library(reshape2) #for melt()
z.molten<-melt(z.lattice)
names(z.molten) <- c("x", "y", "z")
v<-ggplot(z.molten, aes(x,y,z=z))+
geom_tile(aes(fill=z))+
stat_contour(bins=6,aes(x,y,z=z), color="black", size=0.6)+
scale_fill_gradientn(colours=brewer.pal(6,"YlOrRd"))
v

Ten wykres ma tę samą podstawową ideę co fill.contour (), ale kolorowe kafelki nie pasują do konturów bardzo dobrze.

wprowadź opis obrazu tutaj

Nie udało mi się także zmienić wymiarów płytek.

Wszelkie sugestie, jak sprawić, by wynik ggplot2 był bliższy wynikowi fill.contour ()?

Odpowiedzi:

13 dla odpowiedzi nr 1

Wydaje się, że istotą twojego pytania jest to, jak utworzyć konturowy wykres w ggplot oddzielny wypełnione kontury, a nie ciągłe kontury, jak przy użyciu konwencjonalnych geom_tile(...) podejście. Oto jeden sposób.

x<-seq(1,11,.03)                    # note finer grid
y<-seq(1,11,.03)
xyz.func<-function(x,y) {-10.4+6.53*x+6.53*y-0.167*x^2-0.167*y^2+0.0500*x*y}
gg <- expand.grid(x=x,y=y)
gg$z <- with(gg,xyz.func(x,y))      # need long format for ggplot
library(ggplot2)
library(RColorBrewer)               #for brewer.pal()
brks <- cut(gg$z,breaks=seq(0,100,len=6))
brks <- gsub(","," - ",brks,fixed=TRUE)
gg$brks <- gsub("\(|\]","",brks)  # reformat guide labels
ggplot(gg,aes(x,y)) +
geom_tile(aes(fill=brks))+
scale_fill_manual("Z",values=brewer.pal(6,"YlOrRd"))+
scale_x_continuous(expand=c(0,0))+
scale_y_continuous(expand=c(0,0))+
coord_fixed()

Zastosowanie np. scale_x_continuos(...) jest po prostu pozbyciem się dodatkowej przestrzeni ggplot obraca się wokół granic osi; dobrze dla większości rzeczy, ale rozprasza uwagę na poletkach konturu. Sposób użycia coord_fixed(...) jest po prostu ustawić współczynnik proporcji na 1: 1. Są to opcjonalne.