我正在尝试使用@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()
这产生了这个情节:
如您所见,前两个轮廓的颜色和标签是向后的。有关如何解决此问题的任何建议吗?
PS我希望链接到图像有效。看起来我需要更多的声望点才能在帖子中包含图片:(
答案 0 :(得分:4)
使用cut
创建中断时,会自动返回factor
,按cut
中使用的中断顺序排序。但随后通过brks
调用gsub
将brks
从factor
转换为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