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