Можем ли мы создать аллювиальный график в R для отображения нескольких двумерных распределений вместо полного многомерного распределения?

#r #visualization #categorical-data

#r #визуализация #категориальный-данные

Вопрос:

Я хочу отобразить множественное двумерное распределение в R вместо полного многомерного распределения. Следующий код, приведенный в виньетке пакета alluvial, использует график намыва для отображения полного многомерного распределения (класс, пол, возраст, выжившие) для набора данных Titanic.

 require(dplyr)
require(alluvial)
tit <- as.data.frame(Titanic, stringsAsFactors = FALSE)
head(tit)
alluvial(tit[,1:4], freq=tit$Freq,
     col = ifelse(tit$Survived == "Yes", "orange", "grey"),
     border = ifelse(tit$Survived == "Yes", "orange", "grey"),
     hide = tit$Freq == 0,
     cex = 0.7)
  

введите описание изображения здесь

Вместо визуализации полного многомерного распределения я хотел бы визуализировать двумерные распределения (класс, пол), (пол, возраст) и (Возраст, выживший), используя один аллювиальный график. Количество трех двумерных распределений равно

 tit%>%group_by(Class,Sex)%>%summarize(Freq=sum(Freq))%>%ungroup() 
tit%>%group_by(Sex,Age)%>%summarize(Freq=sum(Freq))%>%ungroup()
tit%>%group_by(Age,Survived)%>%summarize(Freq=sum(Freq))%>%ungroup()
  

Знаете ли вы, возможно ли это с использованием пакета alluvial или альтернативного?

Для этого конкретного примера использование аллювиального графика может показаться сомнительным. Но это полностью имеет смысл, когда переменные упорядочены и когда мы хотим визуализировать двумерные распределения (var1, var2), (var2, var3), …

Комментарии:

1. Я не понимаю, что вы ожидаете от результата

2. вы выполняете это: tmp <- tit %>% group_by(Class, Sex) %>% summarize(Freq = sum(Freq)) %>% ungroup();alluvial(tmp[1:2], freq = tmp$Freq) ? для каждой пары переменных, которые вы написали?

3. да, именно так, но с распределениями (класс, пол), (пол, возраст) и (Возраст, выживший) на одном и том же аллювиальном графике.

Ответ №1:

Чтобы настроить три аллювиальных графика вместе, вы можете сделать следующее.

Обратите внимание, что count это dplyr более компактная версия group_by summarise ungroup .

 library(dplyr)
library(alluvial)

tit <- as.data.frame(Titanic, stringsAsFactors = TRUE)

oldpar <- par(mfrow=c(1, 3)) # set up alignment

with(count(tit, Class, Sex     , wt = Freq), alluvial(Class, Sex     , freq = n))
with(count(tit, Sex  , Age     , wt = Freq), alluvial(Sex  , Age     , freq = n))
with(count(tit, Age  , Survived, wt = Freq), alluvial(Age  , Survived, freq = n))

par(oldpar) # reset par
  

введите описание изображения здесь

Рекомендуется сбрасывать par его каждый раз, когда вы его изменяете, поскольку это общий параметр, который может повлиять на другие части вашего кода.

Комментарии:

1. Большое спасибо, это здорово. Еще лучше было бы удалить повторяющиеся гистограммы (гистограмма для пола и гистограмма для возраста), но это может быть слишком сложным для достижения. Еще раз спасибо.