R Corrgram 显示丰度为零的频率对 'Pie Method'

R Corrgram showing frequency pairs that have zero abundance 'Pie Method'

我正在尝试使用 Zuur et al (2010) 可重现的 R 代码(下方)重现一个 corrgram(下图;图 1),显示水鸟物种对的丰度均为零的频率。圆圈的颜色和填充量对应于具有双零的观测值的比例。从左下角到右上角的对角线 运行ning 表示变量为零的观测值百分比。

我已经为我的数据调整了这段代码,但是在 运行 为两个数据集设置代码后我遇到了同样的问题。当我 运行 代码时,corrgram 内的圆圈没有填充,并且保持为空(下图;图 2)。

但是我很困惑为什么我会遇到这个问题。如果有人能解决为什么会发生这种情况,那么我将非常感谢您的帮助。

数据:Zuur 等人 (2010)

数据太大,无法包含在这个 post 中,但可以在名为 ElphickBirdData.txt [=16] 的 supporting materials section 中找到=]

R 代码:Zuur 等人 (2010)

RiceField <- read.table(file="ElphickBirdData.txt", header = TRUE)

AllS <- c(
 "TUSW",     "GWFG",     "WHGO",     "CAGO",     "MALL",
 "GADW",     "GWTE",     "CITE",     "UNTE",     "AMWI",     "NOPI",
 "NOSH",     "RIDU",     "CANV",     "BUFF",     "WODU",     "RUDU",
 "EUWI",     "UNDU",     "PBGB",     "SORA",     "COOT",     "COMO",
 "AMBI",     "BCNH",     "GBHE",     "SNEG",     "GREG",     "WFIB",
 "SACR",     "AMAV",     "BNST",     "BBPL",     "KILL",     "LBCU",
 "GRYE",     "LEYE",     "LBDO",     "SNIP",     "DUNL",     "WESA",
 "LESA",     "PEEP",     "RUFF",     "UNSH",     "RBGU",     "HEGU",
 "CAGU",     "GUSP")

#Determine species richness
Richness <- colSums(RiceField[,AllS] > 0, na.rm = TRUE)

#Remove all covariates
Birds  <- RiceField[,AllS]

#To reduce the of variables in the figure, we only used the
#20 species that occured at more than 40 sites.
#As a result, N = 20. Else it becomes a mess.
 Birds2 <- Birds[, Richness > 40]
 N <- ncol(Birds2)

AllNames <- names(Birds2)
A <- matrix(nrow = N, ncol = N)

 for (i in 1:N){
    for (j in 1:N){
 A[i,j] <- sum(RiceField[,AllS[i]]==0  & RiceField[,AllS[j]]==0,  na.rm=TRUE)
     }}


A1 <- A/2035
print(A1, digits = 2)
rownames(A1) <- AllNames
colnames(A1) <- AllNames


 library(lattice)
 library(RColorBrewer)

panel.corrgram.2 <- function(x, y, z, subscripts, at = pretty(z), scale = 0.8, ...)
{
require("grid", quietly = TRUE)
x <- as.numeric(x)[subscripts]
y <- as.numeric(y)[subscripts]
z <- as.numeric(z)[subscripts]
zcol <- level.colors(z, at = at, ...)
for (i in seq(along = z))
{
lims <- range(0, z[i])
tval <- 2 * base::pi *
  seq(from = lims[1], to = lims[2], by = 0.01)
  grid.polygon(x = x[i] + .5 * scale * c(0, sin(tval)),
             y = y[i] + .5 * scale * c(0, cos(tval)),
             default.units = "native",
             gp = gpar(fill = zcol[i]))
 grid.circle(x = x[i], y = y[i], r = .5 * scale,
            default.units = "native")
     }
     }

  levelplot(A1,xlab=NULL,ylab=NULL,
            at=do.breaks(c(0.5,1.01),101),
            panel=panel.corrgram.2,
            scales=list(x=list(rot=90)),
            colorkey=list(space="top"),
            col.regions=colorRampPalette(c("red","white","blue")))

   #Grey colours
   levelplot(A1.bats,xlab=NULL,ylab=NULL,
    at=do.breaks(c(0.5,1.01),101),
    panel=panel.corrgram.2,
    scales=list(x=list(rot=90)),
    colorkey=list(space="top"),
    col.regions=colorRampPalette(c(grey(0.8),grey(0.5),grey(0.2))))

图 1. 图2

你的问题的原因是grid.circles用白色涂抹grid.polygon。您可以通过更改 grid.circlegrid.polygon 的顺序来解决它(或将 gp = gpar(fill=NA) 添加到 grid.circle() )。

panel.corrgram.2.2 <- function(x, y, z, subscripts, at = pretty(z), scale = 0.8, ...)
{
    require("grid", quietly = TRUE)
    x <- as.numeric(x)[subscripts]
    y <- as.numeric(y)[subscripts]
    z <- as.numeric(z)[subscripts]
    zcol <- level.colors(z, at = at, ...)
    for (i in seq(along = z))
    {
        lims <- range(0, z[i])
        tval <- 2 * base::pi *
            seq(from = lims[1], to = lims[2], by = 0.01)
        grid.circle(x = x[i], y = y[i], r = .5 * scale,        # change the order
                    default.units = "native")
        grid.polygon(x = x[i] + .5 * scale * c(0, sin(tval)),
                     y = y[i] + .5 * scale * c(0, cos(tval)),
                     default.units = "native",
                     gp = gpar(fill = zcol[i]))
    }
}

levelplot(A1,xlab=NULL,ylab=NULL,
    at=do.breaks(c(0.5,1.01),101),
    panel=panel.corrgram.2.2,
    scales=list(x=list(rot=90)),
    colorkey=list(space="top"),
    col.regions=colorRampPalette(c("red","white","blue")))