0

siAll,这是对昨天的 muy 问题的跟进。下面我尝试添加一个链接

先前的问题

最新的代码是:

mypanel <- function(x,y,...) {
  panel.xyplot(x, y, ...)
  panel.grid(x=-1, y=-1)
  panel.lmline(x,y,col="red",lwd=1,lty=1)
  panel.text(200,20,bquote(rho == .(correls[x])),cex=.8, font = 2,col="black")
} 

correls <- as.vector(cor(x=mtcars[,2:3],y=mtcars[,1]))
correls<- round(coeff,3)
names(correls)<-names(mtcars[,2:3])

data <- mtcars[,2:3]
charts <- lapply(names(data), function(x) { xyplot (mtcars[,1] ~ mtcars[,x], 
                                                    panel=mypanel,ylab="MPG", xlab=x)})

该代码需要 datset mtcars 和 lattice ,我认为它可能也需要 LtticeExtra 。

如您所见,我计算了相关系数并希望将它们添加到图表中。添加了文本 gest 但有两个问题:

  1. correls[x] 部分没有按我的意愿进行评估,我得到了一个 NA(虽然它在控制台中自行工作,但我总是检查它以查找错误)。我似乎不知道如何解决这个问题,即使是指针也会有所帮助,我很乐意做腿部工作
  2. 在某些图表中,坐标不起作用,因为这是在 lapply 中运行的,这意味着有些是不可见的。在这种情况下,不是第一个图表,是第二个图表)。可以自动定位吗?Agin 只是一个指向要查找或使用的内容的指针表示赞赏

再次感谢

马里奥

更新,面板编号建议的解决方案不起作用,每个图表都是由 lapply 单独创建的,所以它总是 1,所以我没有得到我需要的东西。我修改了代码以尝试处理放置和起始坐标。但是,它并不总是显示,并且由于某种原因它还显示了 correl 中的错误元素,以查看需要使用图表1等手动打印图表。

这是最新的代码

mypanel <- function(x,y,...) {
  panel.xyplot(x, y, ...)
  panel.grid(x=-1, y=-1)
  panel.lmline(x,y,col="red",lwd=1,lty=1)
  panel.text(xmax[x],ymax,bquote(rho == .(correls[x])),pos=4,cex=1, font = 2,col="black")
} 

correls <- as.vector(cor(x=mtcars[,2:10],y=mtcars[,1]))
correls<- round(correls,3)
names(correls)<-names(mtcars[,2:10])
xmax <-sapply(mtcars[,2:10],max)
names(xmax) <- names(mtcars[,2:10])
xmax<-floor(xmax)
ymax <- floor(max(mtcars[,1]))


data <- mtcars[,2:10]
charts <- lapply(names(data), function(x) { xyplot (mtcars[,1] ~ mtcars[,x], 
                                                    panel=mypanel,ylab="MPG", xlab=x,
                                                    xlim=c(0,ceiling(max(mtcars[,x])))
                                                  ,ylim=c(0,ceiling(max(mtcars[,1]))))})

再次感谢您的任何指点

马里奥

4

1 回答 1

0

我终于解决了它,我使用了我找到的函数 multiplot 和 ggplot2,主要是因为它对我来说更有意义(它的语法)并且因为我喜欢它的图表的外观。

这是整个代码,包括我在“Cookbook for R”中找到的 multiplot 函数(非常感谢)。

这可以进一步改进,因为现在我需要重命名用作我的数据的数据集。我意识到我可以将所有这些都包含在一个函数中,但是现在这对我来说并没有太大的麻烦。

我希望这可以帮助别人。

最后,我想说我对文本位置不太满意,理想情况下它会寻找空白空间,但我想这不会那么容易。如果有人知道如何随意分享。

#You need to create an object called my data with your data.frame
#the process will create charts of correlations for the first column versus all others
#and then arrange them in a lattice patter.
#It uses the multiplot function that I found as well as ggplot2

mydata<-mtcars

library(ggplot2)
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
  require(grid)

  # Make a list from the ... arguments and plotlist
  plots <- c(list(...), plotlist)

  numPlots = length(plots)

  # If layout is NULL, then use 'cols' to determine layout
  if (is.null(layout)) {
    # Make the panel
    # ncol: Number of columns of plots
    # nrow: Number of rows needed, calculated from # of cols
    layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
                     ncol = cols, nrow = ceiling(numPlots/cols))
  }

  if (numPlots==1) {
    print(plots[[1]])

  } else {
    # Set up the page
    grid.newpage()
    pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))

    # Make each plot, in the correct location
    for (i in 1:numPlots) {
      # Get the i,j matrix positions of the regions that contain this subplot
      matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))

      print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
                                      layout.pos.col = matchidx$col))
    }
  }
}

mychart <- function(x) {
  c <- round(cor(mydata[,1],mydata[x]),3)
  xmax <-ceiling(max(mydata[,x]))
  xmin <- floor(min(mydata[,x]))
  xpos = floor(max(mydata[,x])*(8/10))
  ypos = floor(max(mydata[,1])*(8/10))
  t = paste("rho ==",c,sep="")
  t1 <- annotate("text",x=xpos,y=ypos,label=t,parse=TRUE,color="red")
  p <- qplot(mydata[,x],mydata[,1],xlab=x,ylab=names(mydata)[1],color=I("blue"))
  s <- stat_smooth(aes(x=mydata[,x],y=mydata[,1]),method="lm",color="red",se=FALSE)
  a <- annotate("text",x=xpos,y=ypos,label=t,parse=TRUE,color="red")
  p<- p+s+a+xlim(xmin,xmax)

}


charts <- NULL
l1 <- NULL
for (i in 2:(length(mydata))) {
  charts[[i]]<- mychart(names(mydata)[i])
}

numcols <- ceiling(sqrt(length(mydata)-1))

multiplot(plotlist=charts[2:length(mydata)],cols=numcols)
于 2013-01-18T04:13:26.293 回答