Діаграми Санкі в R?


86

Я намагаюся візуалізувати свій потік даних за допомогою діаграми Санкі в R.

Я знайшов цей допис у блозі, що посилається на скрипт R, що створює Діаграму Санкі, на жаль, він досить необроблений і дещо обмежений (див. Нижче зразок коду та даних).

Хтось знає інші сценарії - або, можливо, навіть пакет - який є більш розробленим? Моєю кінцевою метою є візуалізація як потоку даних, так і відсотків за відносним розміром компонентів діаграми, як у цих прикладах діаграм Санкі .

Я опублікував дещо подібне запитання у списку r-help , але через два тижні без жодних відповідей я випробовую свою удачу тут, на stackoverflow.

Дякую, Еріку

PS. Мені відомо про графік паралельних наборів , але це не те, що я шукаю.

# 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")

Діаграма Санкі, виготовлена ​​з вищевказаним кодом, Діаграма Санкі, вироблена з кодом вище


2
Мені стрілки здаються чудовими, здається, у вас залишилась точна настройка тексту і ви перебуваєте?
Роман Луштрік,

@Roman Luštrik, я згоден, ця схема зовсім не погана, але мої навички роботи з R все ще обмежені, тому я не можу виконати настільки тонку настройку в R, якби це було те, що ви мали на увазі? Звичайно, я міг би це зробити в Adobe Illustrator або щось подібне, але це порушило б принцип відтворюваного дослідження, який для мене є центральним елементом будь-якої (академічної) роботи. Чи розглядали ви приклади, на які я посилався у дописі ?
Eric Fail

Я усвідомлюю, що моє запитання не є гарним питанням у тому сенсі, що це не конкретна проблема програмування і не безпосередньо практична, а дещо відкрите запитання ( із поширених запитань ). Щоб відповісти на це запитання, потрібно було б мати нагляд за різними варіантами графіків у R, і на цій підставі відповісти на моє запитання " ні", там немає більш розроблених сценаріїв чи пакетів , або потрібно було б знати про більш розроблений метод для створення діаграм Санкі в R і вказівки на неї. Можливо, є краще місце для розміщення цього питання?
Eric Fail

1
Єдине місце, яке я можу придумати - це, можливо, crossvalidated.com.
Роман Луштрік,

Як щодо списку розсилки R-help? r-project.org/mail.html
Алекс Рейнольдс,

Відповіді:


63

Цей сюжет можна створити через networkD3пакет. Це дозволяє створювати інтерактивні схеми мавпочок. Тут ви можете знайти приклад . Я також додав скріншот, щоб ви мали уявлення, як це виглядає.

# 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)

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


4
приклад посилання порушено
rmstmppr

1
Справді. Кращою альтернативою з моменту введення htmlwidgets- це сюжет мавпи з networkD3упаковки. Я оновив допис.
Йонас Тундо,

1
Чи можна мати числові значення як підпис замість цілих чисел? Значення прийнято правильно, але підпис, здається, округлений. Наприклад: значення = 0,8 та значення = 0,2 мають різну ширину рядків, але підпис говорить "0" для обох.
Naveen Mathew

якщо ви намагаєтеся відтворити це на якомусь зразку власних даних, переконайтесь, що перший ідентифікатор джерела починається з 0, а ідентифікатори джерела та цілі є послідовними
Річард

43

Я створив пакет ( riverplot ), який має дещо іншу, але накладається функціональність порівняно з функцією Sankey, і може створювати такі графіки:

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


Це виглядає справді вражаюче! Я подивлюсь на це якомога швидше.
Eric Fail

39

Якщо ви хочете зробити це з R, найкращою ставкою є пропозиція @Roman - зламайте функцію SankeyR . Наприклад, нижче - моє дуже швидке виправлення - просто орієнтуйте ярлики вертикально, незначно їх зміщуйте та зменшуйте шрифт для вхідних рефералів, щоб зробити його вигляд трохи кращим. Ця модифікація змінює лише рядки 171 та 223 у функції 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)

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

Я не є тузом у тригонометрії, але це дійсно те, що потрібно для зміни напрямку стрілок. На мою думку, це було б ідеально - якби ви могли налаштувати вільні стрілки так, щоб вони були орієнтовані горизонтально, а не вертикально. В іншому випадку, чому моє рішення вирішує проблему з орієнтацією міток, це не робить діаграму набагато зручнішою для читання ...


1
це хороший хак, дякую. Я вже зробив це набагато краще. У мене є голос за, і якщо нічого кращого не буде, я радий передати вам нагороду, коли час закінчиться. Крім того, мені подобається ваше ім’я користувача.
Eric Fail

24

На додаток до rCharts , діаграми Sankey тепер можна також генерувати в R за допомогою googleVis (версія> = 0.5.0). Наприклад, у цій публікації описано створення наступної діаграми за допомогою googleVis: введіть тут опис зображення


15

R package також зробить це (з ?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") )

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



6

Судячи з цих визначень цій функції, як і графіку паралельних наборів, не вистачає можливості розділяти та поєднувати потоки (тобто через більше ніж один перехід).

Оскільки діаграми Санкі - це спрямовані зважені графіки , такий пакет, як qgraph, може бути корисним.

SankeyRФункція забезпечує більш чіткі мітки при сортуванні втрати в порядку , як текст по спадаючій поміщається ближче до стріл на без перекриття.


1
Сортування втрат за спаданням порушить якість спрямованості діаграми. Якщо ви уважно подивитесь на схему, яку я подав, ви побачите, що час знаходиться на осі х, отже, поточний порядок. Мені відомо про sankey-diagrams.com та статті про нього, я вперше подумав, коли побачив цей веб-сайт, це відкрити op R і створити гарну Діаграму Санкі в ggplot2 .
Eric Fail

5

подивіться на //sankeybuilder.com, оскільки він пропонує готове рішення, де ви можете завантажувати свої дані та варіації відтворення з часом. Перехід працює добре (подібно до демо-версії YouTube у вашому запитанні). Якщо ви завантажуєте демонстраційну версію SankeyTrend, вона включає багато часових інтервалів (роки даних). Після завантаження (автоматично збирає Sankeys) натисніть кнопку відтворення у верхньому правому куті сторінки для відтворення часових інтервалів, ви навіть можете зробити паузу та відновити час. Демо-адреса тут: SankeyTrend Сподіваюся, це допоможе вам у пошуках ідеальної діаграми Sankey.


4

Для повноти, є також ggalluvialпакет, який є ggplot2 extensionдля алювіальних / діаграм Санкі.

Ось приклад, взятий з документації пакета

# 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")

Створено 13.11.2018 пакетом reprex (v0.2.1.9000)


1

Просто відкритий пакет, який використовує алювіальну діаграму для візуалізації етапів робочого процесу. Оскільки історія зберігається, коли використовується алювіальна форма, по краях немає перехрестя.

https://github.com/claytontstanley/shiny.alluvial

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.