Saya mencoba untuk memvisualisasikan aliran data saya dengan Diagram Sankey di R.
Saya menemukan posting blog ini tertaut ke skrip R yang menghasilkan Diagram Sankey, sayangnya ini cukup mentah dan agak terbatas (lihat di bawah untuk contoh kode dan data).
Adakah yang tahu tentang skrip lain — atau mungkin bahkan sebuah paket — yang lebih berkembang? Tujuan akhir saya adalah untuk memvisualisasikan aliran data dan persentase dengan ukuran relatif komponen diagram, seperti dalam contoh Diagram Sankey ini .
Saya memposting pertanyaan yang agak mirip di daftar r-help , tetapi setelah dua minggu tanpa tanggapan, saya mencoba keberuntungan saya di sini di stackoverflow.
Terima kasih, Eric
PS. Saya mengetahui tentang Parallel Sets Plot , tapi bukan itu yang saya cari.
# 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")
Diagram Sankey diproduksi dengan kode di atas,
sumber
Jawaban:
Plot ini dapat dibuat melalui
networkD3
paket. Ini memungkinkan Anda membuat diagram sankey interaktif. Di sini Anda dapat menemukan contohnya . Saya juga menambahkan tangkapan layar sehingga Anda tahu seperti apa tampilannya.# 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)
sumber
htmlwidgets
adalah plot sankey darinetworkD3
paket. Saya memperbarui posting.Saya telah membuat paket ( plot sungai ) yang memiliki fungsi yang sedikit berbeda, tetapi tumpang tindih dibandingkan dengan fungsi Sankey, dan dapat menghasilkan plot seperti ini:
sumber
Jika Anda ingin melakukannya dengan R, tawaran terbaik Anda sepertinya adalah saran @Roman - hack fungsi SankeyR . Misalnya - di bawah ini adalah perbaikan saya yang sangat cepat - cukup arahkan label secara vertikal, offset sedikit dan kurangi font untuk referensi input agar terlihat sedikit lebih baik. Modifikasi ini hanya mengubah baris 171 dan 223 dalam fungsi SankeyR :
#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)
Saya bukan jagoan trigonometri, tapi inilah yang Anda butuhkan untuk mengubah arah panah. Itu akan ideal dalam pandangan saya - jika Anda bisa menyesuaikan panah yang hilang sehingga mereka berorientasi horizontal daripada vertikal. Jika tidak, mengapa solusi saya memperbaiki masalah dengan orientasi label, itu tidak membuat diagram lebih mudah dibaca ...
sumber
Selain rCharts , diagram Sankey sekarang juga dapat dibuat di R dengan googleVis (versi> = 0.5.0). Misalnya, posting ini menjelaskan pembuatan diagram berikut menggunakan googleVis:
sumber
R's aluvialpaket juga akan melakukan ini (dari
?alluvial
).# 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") )
sumber
plotly memiliki kekuatan yang sama dengan
networkD3
paket ( contoh tautan ).sumber
Dilihat dari definisi ini, fungsi ini, seperti Plot Himpunan Paralel, tidak memiliki kapasitas untuk membagi dan menggabungkan aliran (yaitu melalui lebih dari satu transisi).
Karena diagram Sankey diarahkan pada grafik berbobot , paket seperti qgraph mungkin berguna.
The
SankeyR
Fungsi memberikan label yang lebih jelas jika Anda semacam kerugian dalam urutan sebagai teks ditempatkan lebih dekat ke kepala panah tanpa tumpang tindih.sumber
lihat //sankeybuilder.com karena menawarkan solusi siap pakai di mana Anda dapat mengunggah data dan variasi pemutaran dari waktu ke waktu. Transisi berfungsi dengan baik (mirip dengan demo youtube di pertanyaan Anda). Jika Anda memuat demo SankeyTrend, itu mencakup banyak slot waktu (data Tahun). Setelah dimuat (membangun sankeys secara otomatis), klik tombol putar di sudut kanan atas halaman untuk pemutaran slot waktu, Anda bahkan dapat menjeda dan melanjutkan waktu. Demo url ada di sini: SankeyTrend Semoga ini membantu pencarian Anda untuk diagram Sankey yang sempurna.
sumber
Untuk kelengkapannya juga tersedia
ggalluvial
paket yaitu aggplot2 extension
untuk diagram aluvial / Sankey.Berikut adalah contoh yang diambil dari dokumentasi paket
# 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")
Dibuat pada 2018-11-13 oleh paket reprex reprex (v0.2.1.9000)
sumber
Cukup buka sumber paket yang menggunakan diagram aluvial untuk memvisualisasikan tahapan alur kerja. Karena sejarah disimpan ketika bentuk aluvial digunakan, tidak ada persilangan di tepinya.
https://github.com/claytontstanley/shiny.alluvial
sumber