如何使用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
会将 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))
我正在尝试使用@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
会将 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))