2016-01-21 35 views
3

我试图定义一个函数来产生一对图的对角线上的散点图。诀窍是我想要在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) 
+0

我没用过'pairs',但有一次我在'GGally :: ggpairs'瞥了一眼;看看最后一个例子(“自定义例子”),在那里将任意一个绘图分配给子图的网格中的任何一个坐标似乎相当容易。我试图用'custom_car [1,1] < - plot'在对角线上绘制一个图。 – Henrik

+0

在'panel.splot'里面,你试图把'yvar'的'min'和'max'包含字符串'Species'。我不认为你打算这么做。这不会解决您的问题,但它似乎是一个问题。 – steveb

+0

什么'x'在'双(虹膜[,C(1:4)],diag.panel = panel.splot(X = X,yvar = “物种”)) ' – mtoto

回答

1

尽管你的例子情节,我解释这个稍有不同(错误地)由于使用物种作为纵轴变量。休伯特给出了答案,但认为它可能会增加一些东西。

使用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))) 
+1

我喜欢语法! – HubertL

+0

@ user20650你是对的。我打算把这个问题看成水平轴而不是垂直轴。我的错。这似乎不是微不足道的,因为当我将映射参数更改为'mapping = aes(x = Year)'时,出现以下错误:错误:geom_point需要以下缺失美学:y'。我没有在'diag_fun'中看到可以改变功能的地方。这里的任何想法?继此之后,我想要在每个对角线面板上显示x轴标签(水平)。有关我如何完成此任务的任何想法? – boshek

+1

i @ bosshek;我明天生病了 - 你想要点分情绪吗?或者你想要盒状图吗? (ps足够在'diag_fn'中添加'+ coord_flip()' - 名称位于右下方的面板中 – user20650

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

你仍然必须处理的文本大小

+0

这就是为什么我暗示像'图(虹膜[,YV],X)'和直接在面板功能传递YV或者通过默认'panel.splot < - 函数(X,YV = “Specis”)'或匿名'diag.panel = function(x)panel.splot(x,yv =“Species”)' – rawr