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)