
Wykresy Sankeya są często wykorzystywane do ilustrowania przepływów, na przykład zmian w leczeniu w medycynie. Powyższy wykres ilustruje zmiany w leczeniu pacjentów z astmą. Niektóre małe przepływy zostały pominięte.
Dzięki pakietowi network3D robienie wykresów sankey stało się zabawne! Dzięki implementacji skryptów java mogą one być interaktywne.
Podczas korzystania z tego pakietu występują jednak pewne pułapki. Główną z nich jest zmiana kolorów z działki na działkę. Musimy przekazać je za pomocą funkcji d3.scaleOrdinal() i zająć się tymi, których brakuje. Możesz użyć następującego kodu:
colors.list<-c("#FFC312","#C4E538","#12CBC4","#FDA7DF","#ED4C67",
"#F79F1F","#A3CB38","#1289A7","#D980FA","#B53471",
"#EE5A24","#009432","#0652DD","#9980FA","#833471",
"#EA2027","#006266","#1B1464","#5758BB","#6F1E51",
"#747d8c")
##definiuj 21 typów dla kolorów
types.list<-c("type 0", "type 1", "type 2", "type 3",
"typ 4", "typ 5", "typ 6", "typ 7", "typ 8", "typ 9",
"typ 10", "typ 11", "typ 12", "typ 13", "typ 14", "typ 15",
"typ 16", "typ 17", "typ 18", "typ 19", "typ 20")
colors <- paste(colors.list[which.not.missing], collapse = '", "')
types <- paste(types.list[which.not.missing], collapse = '", "')
##przygotuj kolory do postaci JS w funkcji sankeyNetwork
colorJS <- paste('d3.scaleOrdinal() .domain(["', types, '"]).range(["', colors, '"])')
Następnie przekaż je przez sankeyNetwork:
sankeyNetwork(Links = linki, Nodes = węzły,
Source = "źródło", Target = "cel",
Value = "wartość", NodeID = "nazwa",
fontSize= 12, nodeWidth = 10,
colorScale=colorJS,NodeGroup="grupa",
LinkGroup ="grupa")
Fajnym i bardzo przydatnym pomysłem jest połączenie podejścia modeli wielostanowych w celu utworzenia interesujących nas przepływów (patrz pakiet etm w R!).
library(etm)
tr.prob.st 0,], c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22"), tra, s=start,t=stop,cens.name = NULL)
##eraz obliczamy prawdopodobieństwa od czasu rozpoczęcia do czasu zakończenia
probst<-summary(tr.prob.st)
probst<-do.call(rbind,probst)
for.plot<-probst[probst$time==stop,]
##TTTeraz możemy utworzyć linki dla wykresu sankey
links.st<-round(for.plot$P*100,digits=0)
Ponieważ wykres sankey jest widżetem, można go zapisać, korzystając z następującego kodu:
p<-sankeyNetwork(Linki = linki, Węzły = węzły,
Source = "źródło", Target = "cel",
Value = "wartość", NodeID = "nazwa",
fontSize= 12, nodeWidth = 10,
colorScale=my_color,NodeGroup="grupa",
LinkGroup ="grupa")
saveWidget(p, pat, selfcontained = F, libdir = "lib")
Selfcontained=F spowoduje zapisanie go w bibliotece razem z zależnymi skryptami java. Można wybrać opcję Self-contained=T i wtedy skrypt zostanie dołączony do wynikowego pliku html.
Niestety nie ma automatycznego sposobu na uzyskanie numerów obok nazw węzłów. Dlatego trzeba użyć sztuczki i wkleić numery jako część nazwy węzła za pomocą funkcji paste().
Kolejną fajną rzeczą w pakiecie network3D jest to, że można go łatwo zaimplementować w Shiny, dzięki czemu można mieć własny pulpit do tworzenia wykresów sankey.
Jeśli potrzebujesz pomocy, napisz do mnie w komentarzu!
Miłej zabawy!