How to fill in the contour fully using stat_contour

后端 未结 2 1543
星月不相逢
星月不相逢 2020-12-15 22:18

I am looking for ways to fully fill in the contour generated by ggplot2\'s stat_contour. The current result is like this:

# Generate data
library(ggplot2)
li         


        
2条回答
  •  猫巷女王i
    2020-12-15 22:36

    As @tonytonov has suggested this thread, the transparent areas can be deleted by closing the polygons.

    # check x and y grid
    minValue<-sapply(volcano3d,min)
    maxValue<-sapply(volcano3d,max)
    arbitaryValue=min(volcano3d$z-10)
    
    test1<-data.frame(x=minValue[1]-1,y=minValue[2]:maxValue[2],z=arbitaryValue)
    test2<-data.frame(x=minValue[1]:maxValue[1],y=minValue[2]-1,z=arbitaryValue)
    test3<-data.frame(x=maxValue[1]+1,y=minValue[2]:maxValue[2],z=arbitaryValue)
    test4<-data.frame(x=minValue[1]:maxValue[1],y=maxValue[2]+1,z=arbitaryValue)
    test<-rbind(test1,test2,test3,test4)
    
    vol<-rbind(volcano3d,test)
    
    w <- ggplot(vol, aes(x, y, z = z))
    w + stat_contour(geom="polygon", aes(fill=..level..)) # better
    
    # Doesn't work when trying to get rid of unwanted space
    w + stat_contour(geom="polygon", aes(fill=..level..))+
      scale_x_continuous(limits=c(min(volcano3d$x),max(volcano3d$x)), expand=c(0,0))+ # set x limits
      scale_y_continuous(limits=c(min(volcano3d$y),max(volcano3d$y)), expand=c(0,0))  # set y limits
    
    # work here!
    w + stat_contour(geom="polygon", aes(fill=..level..))+
    coord_cartesian(xlim=c(min(volcano3d$x),max(volcano3d$x)),
                    ylim=c(min(volcano3d$y),max(volcano3d$y)))
    

    enter image description here

    The problem remained with this tweak is finding methods aside from trial and error to determine the arbitaryValue.

    [edit from here]

    Just a quick update to show how I am determining the arbitaryValue without having to guess for every datasets.

    BINS<-50
    BINWIDTH<-(diff(range(volcano3d$z))/BINS) # reference from ggplot2 code
    arbitaryValue=min(volcano3d$z)-BINWIDTH*1.5
    

    This seems to work well for the dataset I am working on now. Not sure if applicable with others. Also, note that the fact that I set BINS value here requires that I will have to use bins=BINS in stat_contour.

提交回复
热议问题