[r] R의 Sankey 다이어그램?

R의 Sankey Diagram을 사용하여 데이터 흐름을 시각화하려고합니다.

이 블로그 게시물이 Sankey 다이어그램을 생성하는 R 스크립트에 연결되어 있음을 발견 했습니다 . 안타깝게도 상당히 원시적이며 다소 제한적입니다 (샘플 코드 및 데이터는 아래 참조).

누구든지 더 개발 된 다른 스크립트 또는 패키지에 대해 알고 있습니까? 내 최종 목표는 Sankey Diagrams 예제 에서와 같이 다이어그램 구성 요소의 상대적 크기별로 데이터 흐름과 백분율을 시각화하는 것입니다 .

나는 r-help list에 다소 비슷한 질문을 올렸지 만, 아무런 응답도없이 2 주 후에 나는 여기서 내 행운을 시도하고있다.

고마워, 에릭

추신. 저는 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, 위 코드로 생성 된 Sankey 다이어그램



답변

이 플롯은 networkD3패키지를 통해 생성 할 수 있습니다 . 대화 형 sankey 다이어그램을 만들 수 있습니다. 여기에서 예를 찾을 수 있습니다 . 또한 스크린 샷을 추가하여 어떻게 생겼는지 알 수 있습니다.

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

여기에 이미지 설명 입력


답변

Sankey 함수와 약간 다르지만 기능이 겹치는 패키지 ( riverplot )를 만들었으며 다음 과 같은 플롯을 생성 할 수 있습니다.

여기에 이미지 설명 입력


답변

R로하고 싶다면, 최고의 입찰가는 @Roman 제안 인 것 같습니다 . SankeyR 기능을 해킹하세요 . 예를 들어-아래는 내 매우 빠른 수정 사항입니다. 레이블을 수직으로 맞추고, slighlty 오프셋을 적용하고, 입력 참조 용 글꼴을 줄여 좀 더보기 좋게 만듭니다. 이 수정은 SankeyR 함수 의 171 및 223 행만 변경 합니다.

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

여기에 이미지 설명 입력

나는 삼각법의 에이스가 아니지만, 이것은 화살표의 방향을 바꾸는 데 정말로 필요한 것입니다. 그것은 내 관점에서 이상적 일 것입니다. 만약 당신이 화살표가 수직이 아니라 수평으로 향하도록 루스 화살표를 조정할 수 있다면. 그렇지 않으면 내 솔루션이 레이블 방향 문제를 해결하는 이유는 다이어그램을 훨씬 더 읽기 쉽게 만들지 않습니다.


답변

이외에도 rCharts , Sankey의 도면 이제 R로 생성 될 수 googleVis (버전> = 0.5.0). 예 를 들어이 게시물 에서는 googleVis를 사용하여 다음 다이어그램을 생성하는 방법을 설명합니다.
여기에 이미지 설명 입력


답변

R 패키지도이 작업을 수행합니다 (에서 ?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") )

여기에 이미지 설명 입력


답변

plotlynetworkD3패키지 ( 예제 링크 ) 와 동일한 전력 을가 집니다 .

여기에 이미지 설명 입력


답변

이러한 정의로 판단 할 때이 기능은 병렬 집합 플롯과 같이 흐름을 분할하고 결합 할 수있는 능력이 부족합니다 (즉, 하나 이상의 전환을 통해).

이후 Sankey 다이어그램 가중 그래프 관한 같은 패키지 qgraph을 유용 할 수 있습니다.

SankeyR기능은 텍스트가 겹치지 않고 화살표 머리에 더 가깝게 배치되므로 손실을 내림차순으로 정렬하면 더 명확한 레이블을 제공합니다.