Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 散射图矩阵上下面板中的不同数据_R_Plot_Dataframe - Fatal编程技术网

R 散射图矩阵上下面板中的不同数据

R 散射图矩阵上下面板中的不同数据,r,plot,dataframe,R,Plot,Dataframe,我想在一个图形中绘制两个不同的数据集 我知道我可以使用upper.panel和lower.panel来区分绘图功能。然而,我并没有成功地将我的数据以适当的格式加以利用 假设我有两个组织(“大脑”和“心脏”)和四种情况(1-4)。现在,我可以使用例如对(data$heart)来获得其中一个数据集的散点图矩阵。假设我有以下数据: conditions <- 1 : 4 noise <- rnorm(100) data <- list(brain = sapply(condition

我想在一个图形中绘制两个不同的数据集

我知道我可以使用
upper.panel
lower.panel
来区分绘图功能。然而,我并没有成功地将我的数据以适当的格式加以利用

假设我有两个组织(“大脑”和“心脏”)和四种情况(1-4)。现在,我可以使用例如
对(data$heart)
来获得其中一个数据集的散点图矩阵。假设我有以下数据:

conditions <- 1 : 4
noise <- rnorm(100)
data <- list(brain = sapply(conditions, function (x) noise + 0.1 * rnorm(100)),
             heart = sapply(conditions, function (x) noise + 0.3 * rnorm(100)))

不起作用,因为这将绘制所有条件与所有条件的对比图,而不考虑不同的组织——它基本上忽略了列表,并且在重新排列层次结构时也是如此(即拥有
数据=(A=列表(大脑=…,心脏=…),B=列表(大脑=…,心脏=…),…)
).

这是我通过传递参数所能做的最好的事情:

foo.upper <- function(x,y,ind.upper,col.upper,ind.lower,col.lower,...){
    points(x[ind.upper],y[ind.upper],col = col.upper,...)
}

foo.lower <- function(x,y,ind.lower,col.lower,ind.upper,col.upper,...){
    points(x[ind.lower],y[ind.lower],col = col.lower,...)
}

pairs(dat[,-5],
        lower.panel = foo.lower,
        upper.panel = foo.upper,
        ind.upper = dat$type == 'brain',
        ind.lower = dat$type == 'heart',
        col.upper = 'blue',
        col.lower = 'red')

我在第二个版本中滥用了R的作用域,有点丑陋。(当然,您可能可以在晶格中更干净地执行此操作,但您可能知道这一点。)

我唯一能想到的另一个选择是使用
布局设计您自己的散点图矩阵,但这可能是相当多的工作

晶格编辑

这至少是晶格解的一个开始。它应该可以更好地处理不同的x、y轴范围,但我还没有测试过

dat <- do.call(rbind,data)
dat <- as.data.frame(dat)
dat$grp <- rep(letters[1:2],each = 100)

plower <- function(x,y,grp,...){
    panel.xyplot(x[grp == 'a'],y[grp == 'a'],col = 'red',...)
}

pupper <- function(x,y,grp,...){
    panel.xyplot(x[grp == 'b'],y[grp == 'b'],...)
}

splom(~dat[,1:4],
        data = dat,
        lower.panel = plower,
        upper.panel = pupper,
        grp = dat$grp)

dat这是一个上下部分内容不同的示例,您是否可以根据自己的需要对其进行调整@Ben该示例在文档中,但它没有绘制不同的数据,只是以不同的格式绘制相同的数据。非常巧妙地使用
..
通过
ind.upper
ind.lower
!“为什么不把你(更好的)修改过的答案作为主要答案,在上面炫耀一下呢?”乔乔布林冲出门去赶公共汽车。我到家后再编辑。(我认为我在每个函数中需要所有的参数是错误的…)顺便说一句,我真的找不到任何方法“更干净地使用lattice”来实现这一点——事实上,
lattice
似乎也有同样的问题,但由于文档不是很好,我不确定。不幸的是,如果两个数据集的值范围不同(因为
pairs
限制了考虑所有数据的单个单元格),则上述方法将失败,因此我会对另一种方法感兴趣。@KonradRudolph我尝试了晶格解决方案。(我也讨厌阅读莱迪思的文档;我觉得好像是大卫·福斯特·华莱士写的,或者别的什么。)@joran谢谢!我在上面板和下面板的轴上有不同的比例。关于如何在图中包括这些不同的轴,有什么想法吗?
dat <- as.data.frame(do.call(rbind,data))
dat$type <- rep(c('brain','heart'),each = 100)

foo.upper <- function(x,y,...){
    points(x[dat$type == 'brain'],y[dat$type == 'brain'],col = 'red',...)
}

foo.lower <- function(x,y,...){
    points(x[dat$type == 'heart'],y[dat$type == 'heart'],col = 'blue',...)
}

pairs(dat[,-5],lower.panel = foo.lower,upper.panel = foo.upper)
dat <- do.call(rbind,data)
dat <- as.data.frame(dat)
dat$grp <- rep(letters[1:2],each = 100)

plower <- function(x,y,grp,...){
    panel.xyplot(x[grp == 'a'],y[grp == 'a'],col = 'red',...)
}

pupper <- function(x,y,grp,...){
    panel.xyplot(x[grp == 'b'],y[grp == 'b'],...)
}

splom(~dat[,1:4],
        data = dat,
        lower.panel = plower,
        upper.panel = pupper,
        grp = dat$grp)