如何使用ggplot绘制过零的离散填充轮廓?

How to plot discrete filled contours that cross zero with ggplot?

我正在尝试使用@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()

这会产生这个情节:

如您所见,顶部两个轮廓的颜色和标签是向后的。关于如何解决这个问题有什么建议吗?

Original @jlhoward solution

PS 希望图像的 link 有效。看来我需要更多的声望点才能将图像包含在 post :(

当您使用 cut 创建中断时,您会自动取回一个 factor,按照您在 cut 中使用的中断的顺序排序。但是随后通过对 gsub 的调用更改 brks 会将 brksfactor 转换为 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))