2013-03-25 98 views
6

我想在scatterplot matrix中繪製兩個不同的數據集。散點圖矩陣的上下面板中的不同數據

我知道我可以使用upper.panellower.panel來區分繪圖功能。但是,我沒有成功地將我的數據轉換爲合適的格式來利用它。

假設我有兩個組織(「大腦」和「心臟」)和四個條件(1-4)。現在我可以使用例如pairs(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))) 

我如何獲得這個成格式,以便上面,一個在下面的對角線設置pairs(data, …)地塊一個數據,如下圖所示(綠色=腦,紫色=心臟):

screenshot

只需使用

pairs(data, upper.panel = something, lower.panel = somethingElse) 

不起作用,因爲這將繪製所有條件與無需重新所有條件gard針對不同的組織 - 它基本上忽略了列表,並且在重新排序分層結構時也是如此(即,具有data = (A=list(brain=…, heart=…), B=list(brain=…, heart=…), …))。

+0

下面是上部和下部不同內容的示例,也許您可​​以根據自己的需要調整它。 http://gallery.r-enthusiasts.com/graph/Correlation_Matrix_137 – Ben 2013-03-25 22:15:22

+0

@Ben這個例子是在文檔中,但它不繪製不同的數據,只是不同格式的相同數據。 – 2013-03-25 22:23:45

回答

7

這是最好的我似乎能夠通過傳遞參數做:

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中獲得大量的警告,試圖將這些參數傳遞給常規的繪圖函數,顯然它們不會存在。

這是我的快速的第一次嘗試,但似乎醜陋:

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) 

enter image description here

我在這裏虐待的r範圍界定在這第二個版本有點醜陋的方式。 (當然,你也可能在做到這一點更乾淨,但你可能知道)。

我能想到的唯一的選擇是設計使用layout自己的散點圖矩陣,但是這可能相當一點工作。

格編輯

這裏的至少一個格子的解決方案是一個開始。它應該處理變化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) 
+0

非常巧妙地使用'...'來通過'ind.upper'和'ind.lower'!爲什麼不讓你的(更好的)修改答案成爲主要答案,並將其顯示在最上面? – 2013-03-25 22:45:05

+0

@JoshOBrien正在趕往catcha巴士的大門。當我回家時我會編輯。 (並且我認爲我錯誤地需要在每個函數中使用所有特殊字符...) – joran 2013-03-25 22:49:43

+0

順便提一句,我真的找不到任何方式「更加乾淨地使用格子」 - 事實上,「格子」似乎也遭受同樣的問題但由於文件不是很好,我不確定。如果兩個數據集具有不同的值範圍(因爲'pairs'限制單個單元格考慮*所有*數據),所以上述方法不幸失敗,所以我會對另一種選擇感興趣。 – 2013-07-22 15:44:19