r stat_轮廓用多边形填充不正确

r stat_轮廓用多边形填充不正确,r,ggplot2,polygon,R,Ggplot2,Polygon,当我对多边形使用stat\u contour时,有些区域不应该填充,因为那里没有数据,我在图中标记了它们。有人知道如何避免吗?另外,坐标轴和绘图区域之间有空间,如何删除它 以下是绘图代码: plot_contour <- function (da, native ) { h2d<-hist2d(da$germ_div,da[[native]],nbins=40,show=F) h2d$counts<-h2d$counts+1 counts<-log(h2d$c

当我对多边形使用
stat\u contour
时,有些区域不应该填充,因为那里没有数据,我在图中标记了它们。有人知道如何避免吗?另外,坐标轴和绘图区域之间有空间,如何删除它

以下是绘图代码:

plot_contour <- function (da, native ) {
  h2d<-hist2d(da$germ_div,da[[native]],nbins=40,show=F)
  h2d$counts<-h2d$counts+1
  counts<-log(h2d$counts, base=10)
  rownames(counts)<-h2d$x
  colnames(counts)<-h2d$y
  counts<-melt(counts)
  names(counts)<-c('x','y','z')
  ggplot(counts,aes(x,y))+

  stat_contour(expand=c(0,0),aes(z=z,fill=..level..),geom='polygon')+
  stat_contour( data=counts[counts$x<=75,],aes(z=z,fill=..level..),bins=50,geom='polygon')+
  scale_fill_gradientn(expand=c(0,0),colours=rainbow(1000),
                     limits=c(log(2,base=10),4),na.value='white',guide=F)+
  geom_contour(aes(z=z,colour=..level..),size=1.5)+
  scale_color_gradientn(colours=rainbow(30),limits=c(log(2,base=10),4),na.value='white', 
                            guide=F) + theme_bw()+
  scale_x_continuous(expand=c(0,0),limits=c(0,50))+ 
 scale_y_continuous(expand=c(0,0),limits=c(40,100))+ 
  labs(x=NULL, y=NULL, title=NULL)+ 
       theme(axis.text.x = element_text(family='Times', colour="black", size=20, angle=NULL, 
             hjust=NULL,vjust=NULL,face="plain"),
             axis.text.y = element_text( family='Times', colour="black", size=20,angle=NULL, 
             hjust=NULL,vjust=NULL,face="plain")
          )

       }

da<-read.table('test.txt',header=T)
i<-'test'

plot_contour(da,i)

plot\u contour这不适合评论,因此作为答案发布:

stat_contour不能很好地处理未闭合的多边形。此外,手动设置箱时会出现精度问题,从而导致实际等高线计算出错(当等高线箱与绘图数据相同,但由于精度问题而无法识别为相同时,会发生这种情况)

第一个问题可以通过将网格在每个方向上扩展1来解决,然后将矩阵中低于所关心的最低值的每个值设置为任意低的值。这将强制等高线计算关闭在绘图边缘打开的所有多边形。然后可以使用
coord_cartesian(xlim=c(…)
设置限制,使轴与图形齐平

第二个问题,我不知道有没有一种不修改ggplot代码的好方法来解决。您可能不会受到此问题的影响。

@BrodieG 你的答案是正确的,但是没有一些代码就有点困难

添加以下行以及适当的x、y值(这是最好的猜测),可以让事情更清楚:

   xlim(-10, 60)+
   ylim(30, 120)+
   coord_cartesian(xlim=c(0, 50),ylim=c(40, 100))