我一直在学习ggplot2,并希望将它用于我的所有R图形。但是,我还没有找到一种方法来制作一个类似于传统轮廓图的等高线图,就像使用lattice:filled.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"))
这给了我一个很好的轮廓图。
现在,让我们在ggplot2中尝试相同的事情。基于我所阅读的所有内容(特别是Drawing labels on flat section of contour lines in 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()具有相同的基本概念,但彩色图块不能很好地符合轮廓。
我也没有成功改变瓷砖的尺寸。
有关如何让ggplot2的输出更接近fill.contour()的输出的任何建议?
答案 0 :(得分:13)
您的问题的本质似乎是如何使用离散填充轮廓在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。这些是可选的。