2014-07-12 47 views
4

执行代码here时出现问题。错误消息如下。R中的多个轮廓图

错误。内部(filledcontour(as.double(x)中,as.double(Y)中,z,as.double(水平),: 没有。内部函数 'filledcontour'

我所做的只是复制和粘贴的三个文件一起,即filled.contour3.R,filled.legend.R和例4面板轮廓与一个legend.R从here情节。

filled.contour3 <- function (x = seq(0, 1, length.out = nrow(z)), 
      y = seq(0, 1, length.out = ncol(z)), z, xlim = range(x, finite = TRUE), 
      ylim = range(y, finite = TRUE), zlim = range(z, finite = TRUE), 
      levels = pretty(zlim, nlevels), nlevels = 20, color.palette = cm.colors, 
      col = color.palette(length(levels) - 1), plot.title, plot.axes, 
      key.title, key.axes, asp = NA, xaxs = "i", yaxs = "i", las = 1, 
      axes = TRUE, frame.plot = axes,mar, ...) 
    { 
    # modification by Ian Taylor of the filled.contour function 
    # to remove the key and facilitate overplotting with contour() 
    # further modified by Carey McGilliard and Bridget Ferris 
    # to allow multiple plots on one page 

    if (missing(z)) { 
     if (!missing(x)) { 
     if (is.list(x)) { 
      z <- x$z 
      y <- x$y 
      x <- x$x 
     } 
     else { 
      z <- x 
      x <- seq.int(0, 1, length.out = nrow(z)) 
     } 
     } 
     else stop("no 'z' matrix specified") 
    } 
    else if (is.list(x)) { 
     y <- x$y 
     x <- x$x 
    } 
    if (any(diff(x) <= 0) || any(diff(y) <= 0)) 
     stop("increasing 'x' and 'y' values expected") 
    # mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar 
    # on.exit(par(par.orig)) 
    # w <- (3 + mar.orig[2]) * par("csi") * 2.54 
    # par(las = las) 
    # mar <- mar.orig 
    plot.new() 
    # par(mar=mar) 
    plot.window(xlim, ylim, "", xaxs = xaxs, yaxs = yaxs, asp = asp) 
    if (!is.matrix(z) || nrow(z) <= 1 || ncol(z) <= 1) 
     stop("no proper 'z' matrix specified") 
    if (!is.double(z)) 
     storage.mode(z) <- "double" 
    .Internal(filledcontour(as.double(x), as.double(y), z, as.double(levels), 
          col = col)) 
    if (missing(plot.axes)) { 
     if (axes) { 
     title(main = "", xlab = "", ylab = "") 
     Axis(x, side = 1) 
     Axis(y, side = 2) 
     } 
    } 
    else plot.axes 
    if (frame.plot) 
     box() 
    if (missing(plot.title)) 
     title(...) 
    else plot.title 
    invisible() 
    } 

    filled.legend <- function (x = seq(0, 1, length.out = nrow(z)), y = seq(0, 1, 
                 length.out = ncol(z)), z, xlim 
    range(x, finite = TRUE), 
      ylim = range(y, finite = TRUE), zlim = range(z, finite = TRUE), 
      levels = pretty(zlim, nlevels), nlevels = 20, color.palette = cm.colors, 
      col = color.palette(length(levels) - 1), plot.title, plot.axes, 
      key.title, key.axes, asp = NA, xaxs = "i", yaxs = "i", las = 1, 
      axes = TRUE, frame.plot = axes, ...) 
    { 
    # modification of filled.contour by Carey McGilliard and Bridget Ferris 
    # designed to just plot the legend 
    if (missing(z)) { 
     if (!missing(x)) { 
     if (is.list(x)) { 
      z <- x$z 
      y <- x$y 
      x <- x$x 
     } 
     else { 
      z <- x 
      x <- seq.int(0, 1, length.out = nrow(z)) 
     } 
     } 
     else stop("no 'z' matrix specified") 
    } 
    else if (is.list(x)) { 
     y <- x$y 
     x <- x$x 
    } 
    if (any(diff(x) <= 0) || any(diff(y) <= 0)) 
     stop("increasing 'x' and 'y' values expected") 
    # mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar 
    # on.exit(par(par.orig)) 
    # w <- (3 + mar.orig[2L]) * par("csi") * 2.54 
    #layout(matrix(c(2, 1), ncol = 2L), widths = c(1, lcm(w))) 
    # par(las = las) 
    # mar <- mar.orig 
    # mar[4L] <- mar[2L] 
    # mar[2L] <- 1 
    # par(mar = mar) 
    # plot.new() 
    plot.window(xlim = c(0, 1), ylim = range(levels), xaxs = "i", 
       yaxs = "i") 
    rect(0, levels[-length(levels)], 1, levels[-1L], col = col) 
    if (missing(key.axes)) { 
     if (axes) 
     axis(4) 
    } 
    else key.axes 
    box() 
    } 
# 
# if (!missing(key.title)) 
#  key.title 
# mar <- mar.orig 
# mar[4L] <- 1 
# par(mar = mar) 
# plot.new() 
# plot.window(xlim, ylim, "", xaxs = xaxs, yaxs = yaxs, asp = asp) 
# if (!is.matrix(z) || nrow(z) <= 1L || ncol(z) <= 1L) 
#  stop("no proper 'z' matrix specified") 
# if (!is.double(z)) 
#  storage.mode(z) <- "double" 
# .Internal(filledcontour(as.double(x), as.double(y), z, as.double(levels), 
#  col = col)) 
# if (missing(plot.axes)) { 
#  if (axes) { 
#   title(main = "", xlab = "", ylab = "") 
#   Axis(x, side = 1) 
#   Axis(y, side = 2) 
#  } 
# } 
# else plot.axes 
# if (frame.plot) 
#  box() 
# if (missing(plot.title)) 
#  title(...) 
# else plot.title 
# invisible() 
#} 



    MakeLetter <- function(a, where="topleft", cex=2) 
    legend(where, pt.cex=0, bty="n", title=a, cex=cex, legend=NA) 

#------------------------------------------------------ 
#Generate some fake data 
x = rep(c(10,11,12),length = 9) 
y = rep(c(1,2,3),each = 3) 
z = runif(n=9,min = 0,max = 1) 


xcoords = unique(x) 
ycoords = unique(y) 
surface.matrix = matrix(z,nrow=length(xcoords),ncol=length(ycoords),byrow=T) 
#------------------------------------------------------ 

#plot.new() is necessary if using the modified versions of filled.contour 
plot.new() 

#I am organizing where the plots appear on the page using the "plt" argument in "par()" 
par(new = "TRUE",plt = c(0.1,0.4,0.60,0.95),las = 1,cex.axis = 1) 

#Top left plot: 
filled.contour3(xcoords,ycoords,surface.matrix,color=terrain.colors,xlab = "",ylab = "",xlim = c(min(xcoords),max(xcoords)),ylim = c(min(ycoords),max(ycoords)),zlim = c(min(surface.matrix),max(surface.matrix))) 
#The xpd=NA allows for writing outside the plot limits, but still using the the x and y axes to place the text 
par(xpd = NA) 
text(x=11,y=1.5,"x",cex = 1.5,font = 2) 
MakeLetter("(a)") 

#Top right plot: 
par(new = "TRUE",plt = c(0.5,0.8,0.60,0.95),las = 1,cex.axis = 1) 
filled.contour3(xcoords,ycoords,surface.matrix,color=heat.colors,xlab = "",ylab = "",xlim = c(min(xcoords),max(xcoords)),ylim = c(min(ycoords),max(ycoords)),zlim = c(-1,1)) 
#Alternatively, you could set z axis limits to depend on the min and max values in surface.matrix. 
#filled.contour3(xcoords,ycoords,surface.matrix,color=heat.colors,xlab = "",ylab = "",xlim = c(min(xcoords),max(xcoords)),ylim = c(min(ycoords),max(ycoords)),zlim = c(min(surface.matrix),max(surface.matrix))) 
text(x=11,y=1.5,"x",cex = 1.5,font = 2) 
MakeLetter("(b)") 

#Bottom left plot: 
par(new = "TRUE",plt = c(0.1,0.4,0.15,0.5),las = 1,cex.axis = 1) 
filled.contour3(xcoords,ycoords,surface.matrix,col=gray(seq(1,.1,length=11)), nlevels=11,xlab = "",ylab = "",xlim = c(min(xcoords),max(xcoords)),ylim = c(min(ycoords),max(ycoords)),zlim = c(-1,1)) 
text(x=11,y=1.5,"x",cex = 1.5,font = 2,col = "white") 
MakeLetter("(c)") 

#Bottom right plot: 
par(new = "TRUE",plt = c(0.5,0.8,0.15,0.5),las = 1,cex.axis = 1) 
filled.contour3(xcoords,ycoords,surface.matrix,color = terrain.colors,xlab = "",ylab = "",xlim = c(min(xcoords),max(xcoords)),ylim = c(min(ycoords),max(ycoords)),zlim = c(-1,1)) 
text(x=11,y=1.5,"hello",cex = 1.5,font = 2) 
MakeLetter("(d)") 

#Add a legend: 
par(new = "TRUE",plt = c(0.85,0.9,0.25,0.85),las = 1,cex.axis = 1) 
filled.legend(xcoords,ycoords,surface.matrix,color = terrain.colors,xlab = "",ylab = "",xlim = c(min(xintercepts),max(xintercepts)),ylim = c(min(slopes),max(slopes)),zlim = c(-1,1)) 

#Add some figure labels 
par(xpd=NA,cex = 1.3) 
text(x = -16.7,y = 0,"slope",srt = 90,cex = 1.3) 
text(x = -8,y = -1.62,expression(paste(italic(x),"-intercept",sep = "")),cex = 1.3) 

开始,我以为这是因为fille dcontour应该是填充.contour。但是,在这个改变之后几乎会弹出同样的错误消息。或者,也许这是一些版本问题,因为代码是在2010年编写的。谁能告诉我为什么我有这样的问题,请问如何解决?

+0

如果你把你的问题完整这是最好的。把所有必要的代码放在这里,而不是让我们去追踪它。也许你在如何把代码放在一起时犯了一个错误。您还应该包含示例输入数据以生成[可重现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – MrFlick

+0

@MrFlick我可以做到这一点。然而,由于这里有两个非常长的功能,所以时间很长。我试图附加一个r文件,但似乎这是不可能的。 – LaTeXFan

+0

@MrFlick我粘贴上面的代码。两个函数是filled.contour3和filled.legend。此后,该例开始了。从链接的问题,你可以看到图表应该从这些代码中获得。但是,我总是收到错误信息。 – LaTeXFan

回答

5

粘贴代码非常有帮助。自从代码首次发布以来,看起来已经改变了fill.contour的工作方式。行

.Internal(filledcontour(as.double(x), as.double(y), z, as.double(levels), 
     col = col)) 

更改为

.filled.contour(as.double(x), as.double(y), z, as.double(levels), 
     col = col) 

这样做,我得到的情节

enter image description here