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

Я хотел бы, чтобы скрыть symetric половину сюжета, который я думаю, что это вводит в заблуждение (аналогично тому, как как, я корреляционных матриц я могу скрыть симметричную половину). Однако я не уверен, как это сделать.

Может ли кто-нибудь помочь? Благодаря

+0

Subset ваши данные, чтобы включать только половина из которых вы хотите. – Gregor

+0

Почему вы говорите, что это вводит в заблуждение? Одним из способов решения этой проблемы было бы сделать что-то похожее на исходный сюжет, который вы связали, и масштабировать его, чтобы представить проценты. Это сделает точку в (A, B) (B, A) (процент от A с B против процента от B с A или наоборот). –

+0

Вводящий в заблуждение, возможно, не правильный термин. Я хотел сказать, что читателям было труднее понять фигуру с обеих половин. Я попытаюсь подмножество данных. Благодаря ! –

ответ

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

работает отлично. благодаря –

Смежные вопросы