如何绘制与ggplot交叉零的离散填充轮廓?

时间:2016-09-24 18:59:19

标签: r ggplot2 lattice

我正在尝试使用@jlhoward提供的解决方案在ggplot中创建具有离散定义的轮廓间隔的等高线图。但是,我的数据集过零,这似乎导致零以下值的颜色和标签不按顺序绘制。

x<-seq(-11,11,.03)                    # note finer grid
y<-seq(-11,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(-50,100,len=6))
brks <- gsub(","," - ",brks,fixed=TRUE)
gg$brks <- gsub("\\(|\\]","",brks)  # reformat guide labels 
ggplot(gg,aes(x,y)) + 
  geom_raster(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()

这产生了这个情节: this plot

如您所见,前两个轮廓的颜色和标签是向后的。有关如何解决此问题的任何建议吗?

Original @jlhoward solution

PS我希望链接到图像有效。看起来我需要更多的声望点才能在帖子中包含图片:(

1 个答案:

答案 0 :(得分:4)

使用cut创建中断时,会自动返回factor,按cut中使用的中断顺序排序。但随后通过brks调用gsubbrksfactor转换为character,其中factor按字母排序。您可以通过调用cut功能重置订单,但在breaks = seq(-50,100,len=6) gg$brks = cut(gg$z, breaks=breaks, labels=paste0(breaks[-length(breaks)]," - ", breaks[-1])) 的原始调用中创建所需的标签会更容易:

cut

现在,您没有str(gg)创建的默认标签,而是拥有您想要的标签。

brks与原始方法和上述方法进行比较,看看ggplot(gg,aes(x,y)) + geom_raster(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() + guides(fill=guide_legend(reverse=TRUE)) 是前者中的字符,后者中是因素。

这是结果图。我也冒昧地将图例顺序反转以与图中的颜色顺序相对应。这样可以更容易地查看颜色和值范围之间的关系。

 A service does not run on its own thread, it runs on the UI thread

enter image description here