R'deki Sankey Diyagramları?


89

Veri akışımı R'de bir Sankey Diyagramı ile görselleştirmeye çalışıyorum.

Bu blog gönderisini Sankey Diyagramı üreten bir R betiğine bağlanırken buldum , maalesef oldukça ham ve biraz sınırlı (örnek kod ve veriler için aşağıya bakın).

Daha gelişmiş başka komut dosyaları - veya belki bir paket - bilen var mı? Nihai hedefim, Sankey Diyagramlarının bu örneklerinde olduğu gibi, hem veri akışını hem de yüzdeleri diyagram bileşenlerinin göreceli boyutuna göre görselleştirmek .

R-yardım listesine biraz benzer bir soru gönderdim , ancak iki hafta sonra herhangi bir yanıt alamayınca burada stackoverflow'da şansımı deniyorum.

Teşekkürler Eric

PS. Paralel Kümeler Grafiğinin farkındayım ama aradığım bu değil.

# thanks to, https://tonybreyal.wordpress.com/2011/11/24/source_https-sourcing-an-r-script-from-github/
  sourc.https     <- function(url, ...) {
# install and load the RCurl package 
if (match('RCurl', nomatch=0, installed.packages()[,1])==0) {
  install.packages(c("RCurl"), dependencies = TRUE)
  require(RCurl)  
} else require(RCurl)    

# parse and evaluate each .R script
  sapply(c(url, ...), function(u) {
    eval(parse(text = getURL(u, followlocation = TRUE, 
    cainfo  = system.file("CurlSSL", "cacert.pem", 
    package = "RCurl"))), envir = .GlobalEnv)
 } )
 }

# from https://gist.github.com/1423501
sourc.https("https://raw.github.com/gist/1423501/55b3c6f11e4918cb6264492528b1ad01c429e581/Sankey.R")

# My example (there is another example inside Sankey.R):
inputs = c(6, 144)
losses = c(6,47,14,7, 7, 35, 34)
unit = "n ="

labels = c("Transfers",
           "Referrals\n",
           "Unable to Engage",
           "Consultation only",
           "Did not complete the intake",
           "Did not engage in Treatment",
           "Discontinued Mid-Treatment",
           "Completed Treatment",
           "Active in \nTreatment")

SankeyR(inputs,losses,unit,labels)

# Clean up my mess
rm("inputs", "labels", "losses", "SankeyR", "sourc.https", "unit")

Yukarıdaki kod ile oluşturulmuş Sankey Diyagramı, Yukarıdaki kod ile oluşturulmuş Sankey Diyagramı


2
Oklar bana iyi görünüyor, metnin ince ayarını yapmana izin vermişsin ve var mısın?
Roman Luštrik

@Roman Luštrik, kabul ediyorum, bu diyagram hiç de fena değil, ancak R becerilerim hala sınırlı, bu yüzden R'de o kadar ince ayar yapamam, eğer demek istediğin buysa? Elbette bunu Adobe Illustrator'da veya onun gibi bir şeyde yapabilirdim, ancak bu benim için herhangi bir (akademik) çalışmanın merkezi bir unsuru olan tekrarlanabilir araştırma ilkesini kıracaktır. Gönderide bağlantı verdiğim örneklere baktın mı?
Eric Başarısız

Sorumun belirli bir programlama problemi olmadığı ve doğrudan pratik olmadığı için iyi bir soru olmadığını, ancak biraz açık uçlu bir soru ( SSS'den ) olduğunun farkındayım . Bu soruyu cevaplamak için ya R'deki farklı grafik seçenekleri üzerinde gözetim sahibi olunmalı ve bu temelde sorumu hayır olarak yanıtlayın , dışarıda daha gelişmiş hiçbir komut dosyası veya paket yok ya da birinin bilinmesi gerekir. R'de Sankey Diyagramları üretmek ve ona işaret etmek için daha gelişmiş bir yöntem. Belki bu soruyu göndermek için daha iyi bir yer vardır?
Eric Başarısız

1
Bulabileceğim tek yer crossvalidated.com olabilir.
Roman Luštrik

R-help posta listesine ne dersiniz? r-project.org/mail.html
Alex Reynolds

Yanıtlar:


63

Bu çizim, networkD3paket aracılığıyla oluşturulabilir . Etkileşimli sankey diyagramları oluşturmanıza olanak sağlar. Burada bir örnek bulabilirsiniz . Neye benzediğine dair bir fikriniz olması için bir ekran görüntüsü de ekledim.

# Load package
library(networkD3)

# Load energy projection data
# Load energy projection data
URL <- paste0(
        "https://cdn.rawgit.com/christophergandrud/networkD3/",
        "master/JSONdata/energy.json")
Energy <- jsonlite::fromJSON(URL)
# Plot
sankeyNetwork(Links = Energy$links, Nodes = Energy$nodes, Source = "source",
             Target = "target", Value = "value", NodeID = "name",
             units = "TWh", fontSize = 12, nodeWidth = 30)

görüntü açıklamasını buraya girin


4
örnek bağlantı bozuk
rmstmppr

1
Aslında. htmlwidgetsPiyasaya sürüldüğünden beri daha iyi bir alternatif , networkD3paketin içindeki sankey arsasıdır . Gönderiyi güncelledim.
Jonas Tundo

1
Tamsayı yerine sayısal değerlerin başlık olarak kullanılması mümkün müdür? Değerler doğru şekilde alınır, ancak başlık yuvarlanmış gibi görünüyor. Örneğin: değer = 0.8 ve değer = 0.2 farklı çizgi genişliklerine sahiptir, ancak başlık her ikisi için de "0" diyor.
Naveen Mathew

Bunu kendi verilerinizin bir örneğiyle yeniden oluşturmaya çalışırsanız, ilk kaynak kimliğinin 0 ile başladığından ve kaynak ve hedef kimliklerinin birbirini
Richard

43

Sankey işlevine kıyasla biraz farklı, ancak örtüşen işlevselliğe sahip bir paket ( nehir planı ) oluşturdum ve bunun gibi grafikler üretebilirim:

görüntü açıklamasını buraya girin


Bu gerçekten etkileyici görünüyor! En kısa zamanda bir göz atacağım.
Eric Başarısız

39

Bunu R ile yapmak istiyorsanız, en iyi teklifiniz @Roman önerisi gibi görünüyor - SankeyR işlevini hackleyin . Örneğin - aşağıda çok hızlı bir düzeltme var - etiketleri dikey olarak yönlendirin, hafifçe kaydırın ve biraz daha iyi görünmesi için giriş referansları için yazı tipini azaltın. Bu değişiklik yalnızca SankeyR işlevinde satır 171 ve 223'ü değiştirir :

    #line171 - change oversized font size of input label
    fontsize = max(0.5,frInputs[j]*1.5)#1.5 instead of 2.5 

    #line223 - srt changes from 35 to 90 to orient labels vertically, 
    #and offset adjusts them to get better alignment with arrows
    text(txtX, txtY, fullLabel, cex=fontsize, pos=4, srt=90, offset=0.1)

görüntü açıklamasını buraya girin

Trigonometride as değilim, ama okların yönünü değiştirmek için gerçekten ihtiyacınız olan şey bu. Benim görüşüme göre bu ideal olurdu - eğer gevşek okları dikey yerine yatay olarak yönlendirebilseydiniz. Aksi takdirde, çözümüm neden etiket yönelimiyle ilgili sorunu çözüyor, diyagramı çok daha okunaklı hale getirmiyor ...


1
bu güzel bir hack, teşekkürler. Ben zaten çok daha iyi hale getirdim. Ek oyumu aldınız ve daha iyi bir şey olmazsa süre bittiğinde ödülü size transfer etmekten mutluluk duyarım. Ayrıca kullanıcı adınızı beğendim.
Eric Başarısız

24

RCharts'a ek olarak , Sankey diyagramları artık googleVis ile R'de de oluşturulabilir (sürüm> = 0.5.0). Örneğin, bu gönderi googleVis kullanılarak aşağıdaki diyagramın oluşturulmasını açıklamaktadır: görüntü açıklamasını buraya girin


15

R'ler paketi de bunu (kimden ?alluvial) yapacak .

# install.packages(c("alluvial"), dependencies = TRUE)
require(alluvial)

# Titanic data
tit <- as.data.frame(Titanic)

# 4d
alluvial( tit[,1:4], freq=tit$Freq, border=NA,
     hide = tit$Freq < quantile(tit$Freq, .50),
     col=ifelse( tit$Class == "3rd" & tit$Sex == "Male", "red", "gray") )

görüntü açıklamasını buraya girin



6

Bakılırsa Bu tanımlardan Paralel Setleri Plot gibi, bu fonksiyon, (birden fazla geçiş yoluyla yani) bölünmüş ve akışlarını birleştirmek kapasitesinden yoksundur.

Yana Sankey diyagramları ağırlıklı grafikler yönlendirilir , böyle bir paket qgraph yararlı olabilir.

SankeyRSıralama metin olarak azalan düzende kayıplar üzerine gelmeden yakın ok başları için yerleştirilirse işlevi daha net etiket sağlar.


1
Sıralama azalan kayıpları diyagram yönsel kalitesini bozar. Gönderdiğim diyagrama yakından bakarsanız, zamanın x ekseninde olduğunu, dolayısıyla mevcut sıralamayı göreceksiniz . Sankey-diagrams.com ve bununla ilgili makalelerin farkındayım, o web sitesini gördüğümde ilk düşüncem R op R'yi açmak ve ggplot2'de güzel bir Sankey Diyagramı oluşturmaktı .
Eric

5

Zaman içinde verilerinizi ve oynatma varyasyonlarınızı yükleyebileceğiniz kullanıma hazır bir çözüm sunduğu için //sankeybuilder.com adresine bir göz atın . Geçiş iyi çalışıyor (sorunuzdaki youtube demosuna benzer). SankeyTrend demosunu yüklerseniz, birçok zaman aralığı içerir (Yıl verileri). Yüklendikten sonra (sankey'leri otomatik olarak oluşturur), zaman aralıklarının oynatılması için sayfanın sağ üst köşesindeki oynat düğmesine tıklayın, hatta zamanı duraklatabilir ve devam ettirebilirsiniz. Demo url burada: SankeyTrend Umarım bu, mükemmel Sankey diyagramı arayışınıza yardımcı olur.


4

Tamlık için, aynı zamanda bir ggalluvialpaket varggplot2 extensionTamlık için, alüvyon / Sankey diyagramları için .

İşte paketin belgelerinden alınan bir örnek

# devtools::install_github("corybrunson/ggalluvial", ref = "optimization")
library(ggalluvial)

titanic_wide <- data.frame(Titanic)
ggplot(data = titanic_wide,
       aes(axis1 = Class, axis2 = Sex, axis3 = Age,
           y = Freq)) +
  scale_x_discrete(limits = c("Class", "Sex", "Age"), expand = c(.1, .05)) +
  xlab("Demographic") +
  geom_alluvium(aes(fill = Survived)) +
  geom_stratum() + geom_text(stat = "stratum", label.strata = TRUE) +
  theme_minimal() +
  ggtitle("passengers on the maiden voyage of the Titanic",
          "stratified by demographics and survival") +
  theme(legend.position = 'bottom')

ggplot(titanic_wide,
       aes(y = Freq,
           axis1 = Survived, axis2 = Sex, axis3 = Class)) +
  geom_alluvium(aes(fill = Class),
                width = 0, knot.pos = 0, reverse = FALSE) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", label.strata = TRUE, reverse = FALSE) +
  scale_x_continuous(expand = c(0, 0), 
                     breaks = 1:3, labels = c("Survived", "Sex", "Class")) +
  scale_y_discrete(expand = c(0, 0)) +
  coord_flip() +
  ggtitle("Titanic survival by class and sex")

2018-11-13'te reprex paketi tarafından oluşturuldu (v0.2.1.9000)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.