2012-04-01 3 views
71

Я пытаюсь визуализировать мой поток данных с Санки диаграммы в R.Схемы Sankey в R?

Я нашел this blog post ссылки на R скрипт, который производит Санки Diagram, к сожалению, это довольно сырой и несколько ограничены (см ниже примеры кода и данных).

Кто-нибудь знает о других сценариях, а может быть, и о пакете, который более развит? Моя конечная цель - визуализировать как поток данных, так и проценты по относительным размерам компонентов диаграммы, например, в these examples of Sankey Diagrams.

Я отправил a somewhat similar question on the r-help list, но после двух недель без каких-либо ответов я пробовал свою удачу здесь, в stackoverflow.

Спасибо, Эрик

PS. Я знаю Parallel Sets Plot, но это не то, что я ищу.

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

Сэнки Схема производства с вышеуказанным кодом, Sankey Diagram produced with the code above

+2

Стрелок выглядеть хорошо для меня, похоже, вы остаетесь с тонкой настройкой текстом и вы в? –

+0

@Roman Luštrik, я согласен, эта диаграмма неплохая, но мои R-навыки все еще ограничены, поэтому я не могу сделать эту тонкую настройку в R, если это было то, что вы имели в виду? Я мог бы, конечно, сделать это в Adobe Illustrator или что-то в этом роде, но это нарушит принцип воспроизводимых исследований, который для меня является центральным элементом любой (академической) работы. Вы посмотрели [примеры, с которыми я связан в сообщении] (http://www.sankey-diagrams.com/tag/software/)? –

+0

Я понимаю, что мой вопрос не является хорошим вопросом в том смысле, что это не конкретная проблема программирования, а не непосредственно практический, но несколько открытый вопрос ([из FAQ] (http://stackoverflow.com/faq)). Чтобы ответить на этот вопрос, нужно было либо иметь надзор над различными вариантами графиков в R, и на этой основе ответить на мой вопрос с помощью _no, нет никаких сценариев или пакетов, которые более развиты, или нужно было бы знать о более разработанный метод для получения диаграмм Санки в R и указать на него. Может быть, есть лучшее место, чтобы опубликовать этот вопрос? –

ответ

6

these definitions Судя по этой функции, как и параллельных наборов Участок, не имеет возможности разделить и объединить потоки (т.е. через более чем одного перехода).

С Sankey diagrams are directed weighted graphs, упаковка qgraph может быть полезна.

Функция SankeyR обеспечивает более четкие метки, если сортировать потери в порядке убывания по мере того, как текст помещается ближе к головам стрелки без перекрытия.

+0

Сортировка _ потери в убывающем порядке_ нарушали бы направленное качество диаграммы. Если вы внимательно посмотрите на представленную мной диаграмму, вы увидите, что _time_ находится по оси x, следовательно, текущий порядок. Я знаю [sankey-diagrams.com] (http://www.sankey-diagrams.com/) и статьи об этом, моя первая мысль, когда я увидел, что веб-сайт должен был открыть op R и создать хороший Sankey Диаграмма в [ggplot2] (http://had.co.nz/ggplot2/). –

36

Если вы хотите сделать это с помощью 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) 

enter image description here

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

+1

это хороший хак, спасибо. Я уже сделал это намного лучше. У вас есть мой голос, и если ничего лучше не приходит, я счастлив передать вам щедрость, когда закончится время. Кроме того, мне нравится ваше имя пользователя. –

34

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

enter image description here

+0

Это выглядит действительно впечатляюще! Я посмотрю на него как можно скорее. –

47

Этот участок может быть создан с помощью networkD3 пакета. Это позволяет создавать интерактивные диаграммы sankey. Здесь вы найдете example. Я также добавил скриншот, чтобы вы поняли, как оно выглядит.

enter image description here

+2

ссылка ссылка сломана – Nelson

+1

Действительно. Лучшая альтернатива с момента появления «htmlwidgets» - это сюжет sankey из пакета 'networkD3'. Я обновил сообщение. – JT85

+1

Возможно ли иметь числовые значения в качестве заголовка вместо целого? Значения принимаются правильно, но подпись кажется округленной. Например: значение = 0,8, а значение = 0,2 имеют разную ширину линии, но в заголовке указано «0» для обоих. –

20

В дополнение к rCharts, Сэнки диаграммы теперь могут быть также генерируется в R с googleVis (версия> = 0.5.0). Например, это post описывает генерацию следующей диаграммы с использованием googleVis: enter image description here

5

взглянуть на //sankeybuilder.com, как это предлагает готовое пойти решение, где вы можете загрузить свои данные и варианты воспроизведения с течением времени. Переход работает хорошо (похоже на демонстрацию youtube в вашем вопросе). Если вы загружаете демонстрационную версию SankeyTrend, она включает в себя много временных интервалов (Годы данных). После загрузки (строит sankeys автоматически), нажмите кнопку воспроизведения в правом верхнем углу страницы для воспроизведения временных интервалов, вы можете даже приостановить и возобновить время. Демо-url здесь: SankeyTrend Надеюсь, это поможет вашему поиску идеальной диаграммы Санки.

9

R's упаковка также сделаю это (от ?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")) 

enter image description here

1

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

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

enter image description here

Смежные вопросы