2016-09-16 121 views
0

我正在處理多個病人的數據庫,並試圖創建一個圖形顯示這些條件之間的關聯。更具體地講,我想獲得類似如下:R ggplot巧合圖

enter image description here

我的數據被組織爲:

mal1 mal2 mal3 etc. 
0 0 1 
1 1 0 
0 1 0 etc. 

我創作的數據我希望它使用下面的代碼顯示:

X <- as.matrix(hdat2) 
out <- crossprod(X) 
diag(out) <- 0  

而且我創建的情節:

out<- melt(out) 
out$value[which(out$value==0)]<-NA 
g <- ggplot(data.frame(out), aes(Var1, Var2)) + geom_point(aes(size = value), colour = "black") + theme_bw() + xlab("") + ylab("") 
g + scale_size_continuous(range=c(2,10))+ 

結果我獲得該地塊

enter image description here

我想隱藏劇情,我認爲這是誤導性的(類似於如何,我相關矩陣我可以的對稱的一半隱藏對稱的一半)。但是,我不知道如何去做。

任何人都可以幫忙嗎? 感謝

+0

子集的數據只包括你想要的一半 – Gregor

+0

爲什麼你說它是誤導性的?解決這個問題的一種方法是做一些類似於你鏈接的原始情節,並將它縮放到目前的百分比,這會使(A,B)處的點成爲(B,A)處的點的不同大小和含義(A與B的百分比與B與A的百分比,反之亦然)。 –

+0

誤導可能不是正確的術語,我想說t帽子讓讀者難以理解這個數字。我會嘗試子集數據。謝謝 ! –

回答

0

首先,一些重複性的數據:

mat <- 
    data.frame(
    malA = sample(0:1, 100, TRUE, c(0.2,0.8)) 
    , malB = sample(0:1, 100, TRUE, c(0.3,0.7)) 
    , malC = sample(0:1, 100, TRUE, c(0.4,0.6)) 
    , malD = sample(0:1, 100, TRUE, c(0.5,0.5)) 
) 

out <- crossprod(as.matrix(mat)) 
diag(out) <- 0 

下面是一個例子限制到只有一半,你有興趣使用dplyr

toPlotHalf <- 
    melt(out) %>% 
    mutate_each(funs(factor(.)) 
       , starts_with("Var")) %>% 
    filter(as.numeric(Var1) < as.numeric(Var2)) 

ggplot(toPlotHalf 
     , aes(Var1, Var2)) + 
    geom_point(aes(size = value), colour = "black") + 
    theme_bw() + xlab("") + ylab("") + 
    scale_size_continuous(range=c(2,10)) 

enter image description here

注,然而,以這種方式,你的情節將會被特殊的疾病所控制,這些疾病很常見。或者,你可以提出的人的比例與具有其他弊病(注意,現在的倒數點不(一定)相同尺寸的每個弊病:

toPlot <- 
    prop.table(out, 1) %>% 
    melt() %>% 
    filter(value > 0) 



ggplot(toPlot 
     , aes(Var1, Var2)) + 
    geom_point(aes(size = value), colour = "black") + 
    theme_bw() + xlab("") + ylab("") + 
    scale_size_continuous(range=c(2,10)) 

enter image description here

+0

完美運作。謝謝 –