Как сделать аналоговый график контура ggplot2 для решетки: fill.contour()?
Я изучаю ggplot2 и надеюсь использовать его для всего моего R-графика. Тем не менее, мне еще предстоит найти способ сделать контурный график, который выглядит аналогично обычному контуру, например, что можно получить с помощью решетки: fill.contour(). Например:
#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"))
Это дает мне хороший контурный график.
![enter image description here]()
Теперь попробуем одно и то же в ggplot2. Лучшее, что я могу придумать, на основе всего, что я прочитал (особенно Рисование меток на плоском разрезе контурных линий в ggplot2):
#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
Этот график имеет ту же основную идею, что и fill.contour(), но цветные плитки не очень хорошо соответствуют контурам.
![enter image description here]()
Мне также не удалось изменить размеры плиток.
Любые предложения о том, как сделать вывод ggplot2 ближе к заполненному контуру() output?
Ответы
Ответ 1
Суть вашего вопроса, похоже, заключается в том, как создать контурный график в ggplot с дискретно заполненными контурами, а не сплошные контуры, так как вы бы использовали обычный подход geom_tile(...)
. Вот один из способов.
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()
![]()
Использование, например, scale_x_continuos(...)
, состоит в том, чтобы избавиться от лишнего пространства ggplot
, помещенного вокруг границ оси; отлично подходит для большинства вещей, но отвлекает контурные сюжеты. Использование coord_fixed(...)
- это просто установить соотношение сторон 1:1. Это необязательно.