2016-09-16 98 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

完美运作。谢谢 –