用于将对()变量映射到对角线中的公共垂直轴变量的函数

时间:2016-01-21 19:37:57

标签: r plot

我正在尝试定义一个函数,以在对图的对角线上生成散点图。诀窍是我想在panel.splot函数中指定垂直轴。最终我认为这里的用途是在对角线上可视化时间序列。举个简单的例子,虽然我想用虹膜数据集来尝试这个,并使用Species作为垂直轴变量。下面的图表产生了一个漂亮的情节:

pairs(iris[,c(1:4)])

所以现在我需要为对角线面板定义一个函数。到目前为止,我的努力是:

panel.splot <- function(x, yvar,...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 2, usr[3:4]))
  plot(yvar,x, xlim=c(min(x),max(x)))
}

然而,当我尝试运行它时,我收到一条错误消息,我不确定如何解释。

pairs(iris[,c(1:4)],diag.panel=panel.splot(x=x, yvar="Species"))

Error in plot.window(...) : invalid 'xlim' value
In addition: Warning messages:
1: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion
2: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion
3: In min(x) : no non-missing arguments to min; returning Inf
4: In max(x) : no non-missing arguments to max; returning -Inf

我无法找到另一个例子。许多其他功能可以创建不同类型的图,但没有任何功能可以完成此操作。

为清楚起见,这是我想象的将在pairs()电话的对角线上产生的情节类型:

plot(iris$Species,iris$Petal.Width)

2 个答案:

答案 0 :(得分:1)

根据rawr建议,我设法得到你的情节:

panel.splot <- function(y)
{
        function(x,yv=y)
        {
                usr <- par("usr"); on.exit(par(usr))
                par(usr = c(0, 2, usr[3:4]), new = TRUE)
                plot(yv,x)
        }
}
pairs(iris[,1:4],diag.panel=panel.splot(iris[,5]))

enter image description here

您仍然需要处理文字大小

答案 1 :(得分:1)

尽管有你的示例情节,但由于使用Species作为垂直轴变量,我对此的解释略有不同(错误)。休伯特给出了答案,但认为它可能会增加一些东西。

使用pairs()

panel.splot <- function(Y, Adjust=0.2){
                    function(x, y=Y, adjust=Adjust)
                    {
                     usr <- par("usr"); on.exit(par(usr))
                     xs <- range(x)
                     ys <- if(is.factor(y)) c(1, nlevels(y)) else range(y)
                     par(usr = c(xs[1], xs[2], ys[1], ys[2]) + c(-adjust, adjust))
                     points(x, y)
                    }
                 }

pairs(iris[, 1:4], diag.panel=panel.splot(Y=iris$Species))

哪个产生

enter image description here

要对ggpairs()执行相同的操作,您还可以定义用户功能

library(GGally)
library(ggplot2)    

# Define diagonal function
diag_fun <- function(data, mapping, ...){
      ggplot(data = data, mapping = mapping) + 
      geom_point(...) 
      }

ggpairs(iris, columns=1:4, 
        diag = list(continuous = diag_fun, mapping=aes(y=Species)))

哪个给出了

enter image description here

更新您的评论...

是的,对于对角线条目,变量作为x映射传递。您可以使用coord_flip()或反转函数中的映射。下面的函数执行此操作,并使用annotate()添加变量名称(ps。您应该可以换出_point geom,例如_boxplot

diag_fun <- function(data, mapping, xnudge=0.95, ynudge=1, pts=lst(), ...){

    # create range for annotate
    lbl <- as.character(mapping$x)
    xmax <- max(data[, as.character(mapping$x)], na.rm=TRUE)
    ymax <- mean(seq(nlevels(data[,as.character(mapping$y)]))) 

    # reverse mapping so no need for coord_flip() 
    tmp <- mapping$y
    mapping$y <- mapping$x
    mapping$x <- tmp

    ggplot(data=data, mapping=mapping) + 
      do.call(geom_point, pts) +
      annotate("text", x=ynudge*ymax, y=xnudge*xmax, label=lbl, ...)
      }

所以要在ggpairs中使用默认值

ggpairs(iris, columns=1:4,  diag = list(continuous = diag_fun, mapping=aes(y=Species)))

您可以使用wrap传递更多参数

ggpairs(iris, columns=1:4,  
        diag = list(continuous = 
                      wrap(diag_fun, 
                           size=10, col="red", # make changes to the text label
                           pts=list(colour="blue")), # make changes to geom_point
                    mapping=aes(y=Species)))