我正在尝试定义一个函数,以在对图的对角线上生成散点图。诀窍是我想在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 :(得分: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]))
您仍然需要处理文字大小
答案 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))
哪个产生
要对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)))
哪个给出了
更新您的评论...
是的,对于对角线条目,变量作为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)))