2016-09-24 46 views
2

我正在尝试使用@jlhoward提供的解决方案,在离散定义的轮廓间隔中在ggplot中绘制轮廓图。但是,我的数据集过零,这似乎导致颜色和零值以下的标签被乱序绘制。如何绘制用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我希望链接到的图像作品。它看起来像我需要更多的声誉分,之前当您使用cut,你会自动得到一个factor,或你在cut使用中断的顺序进行排序的休息,我可以包括在后:(

回答

3

图像。但然后更改brksgsub的呼叫转换brksfactorcharacter,它按字母顺序排列。您可以通过调用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)) 

enter image description here