2012-04-01 13 views
71

मैं आर में संकी आरेख?

आर

में एक Sankey आरेख के साथ अपने डाटा प्रवाह कल्पना करने के लिए कोशिश कर रहा हूँ मैं एक अनुसंधान स्क्रिप्ट है कि एक Sankey आरेख का उत्पादन को जोड़ने, दुर्भाग्य से यह काफी कच्चे और कुछ हद तक सीमित (नमूना कोड और डेटा के लिए नीचे देखें है this blog post पाया)।

क्या किसी को अन्य स्क्रिप्ट्स के बारे में पता है-या यहां तक ​​कि एक पैकेज भी - जो अधिक विकसित है? मेरा अंतिम लक्ष्य डेटा प्रवाह और प्रतिशत दोनों को आरेख घटकों के सापेक्ष आकार से देखना है, जैसे these examples of Sankey Diagrams में।

मैंने a somewhat similar question on the r-help list पोस्ट किया, लेकिन बिना किसी प्रतिक्रिया के दो सप्ताह बाद मैं स्टैक ओवरफ्लो पर अपनी किस्मत आजमा रहा हूं।

धन्यवाद, एरिक

पी एस। मुझे 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 आरेख ऊपर कोड के साथ उत्पादन किया, Sankey Diagram produced with the code above

+2

तीर, मेरे लिए ठीक लग लग रहा है आप पाठ ट्यूनिंग के साथ छोड़ दिया रहे हैं और आप में हैं? –

+0

@Roman Luštrik, मैं मानता हूं, यह चित्र बिल्कुल बुरा नहीं है, लेकिन मेरे आर कौशल अभी भी सीमित हैं, इसलिए मैं वास्तव में आर में इतना अच्छा ट्यूनिंग नहीं कर सकता, अगर आपका यही मतलब था? मैं निश्चित रूप से एडोब इलस्ट्रेटर, या ऐसा कुछ कर सकता हूं, लेकिन यह पुनरुत्पादित शोध के सिद्धांत को तोड़ देगा, जो मेरे लिए किसी भी (अकादमिक) काम में एक केंद्रीय तत्व है। क्या आपने [पोस्ट में लिंक किए गए उदाहरण] को देखा [http://www.sankey-diagrams.com/tag/software/)? –

+0

मुझे एहसास है कि मेरा प्रश्न इस अर्थ में एक अच्छा सवाल नहीं है कि यह एक विशिष्ट प्रोग्रामिंग समस्या नहीं है और सीधे व्यावहारिक नहीं है, लेकिन कुछ हद तक खुला प्रश्न ([एफएक्यू से] [http://stackoverflow.com/faq))। इस प्रश्न का उत्तर देने के लिए किसी को या तो आर में विभिन्न ग्राफिंग विकल्पों पर नजर रखना होगा और उस आधार पर _no के साथ मेरे प्रश्न का उत्तर देना होगा, वहां कोई भी स्क्रिप या पैकेज नहीं है जो अधिक विकसित हो, या किसी को पता होना चाहिए आर में संकी आरेखों का उत्पादन करने के लिए और अधिक विकसित विधि और इसे इंगित करें। शायद इस सवाल को पोस्ट करने के लिए एक बेहतर जगह है? –

उत्तर

6

इस समारोह these definitions से परखने के बाद, समानांतर सेट प्लॉट की तरह, विभाजित करने के लिए क्षमता का अभाव है और प्रवाह गठबंधन (अर्थात एक से अधिक संक्रमण के माध्यम से)।

Sankey diagrams are directed weighted graphs के बाद से, qgraph जैसे पैकेज उपयोगी हो सकते हैं।

SankeyR फ़ंक्शन स्पष्ट लेबल प्रदान करता है यदि आप नुकसान को क्रम में क्रमबद्ध करते हैं क्योंकि पाठ ओवरलैपिंग के बिना तीर के सिर के करीब रखा जाता है।

+0

अवरोही क्रम में अवरुद्ध __ आरेख की दिशात्मक गुणवत्ता को तोड़ देगा। यदि आप सबमिट किए गए आरेख पर बारीकी से देखते हैं तो आप देखेंगे कि _time_ एक्स-अक्ष पर है, इसलिए वर्तमान क्रम। मुझे [sankey-diagrams.com] (http://www.sankey-diagrams.com/) और इसके बारे में लेखों के बारे में पता है, मेरा पहला विचार जब मैंने देखा कि वेबसाइट ओपी आर खोलना और एक अच्छा संकी उत्पन्न करना था [Ggplot2] में चित्र [http://had.co.nz/ggplot2/)। –

36

यदि आप इसे आर के साथ करना चाहते हैं, तो आपकी सबसे अच्छी बोली @Roman सुझाव है - SankeyR फ़ंक्शन को हैक करें। उदाहरण के लिए - नीचे मेरा बहुत तेज़ फिक्स है - बस ओरिएंटल लेबल्स वर्टिकल, स्लीघ्ली उन्हें ऑफसेट करता है और इनपुट रेफरल के लिए फ़ॉन्ट को कम करता है ताकि इसे थोड़ा बेहतर लगे। इस संशोधन केवल 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) 

enter image description here

मैं त्रिकोणमिति में कोई इक्का हूँ, लेकिन यह वास्तव में आप तीर की दिशा बदलने के लिए क्या जरूरत है। यह मेरे विचार में आदर्श होगा - यदि आप तीर खो देता है तो वे क्षैतिज रूप से उन्मुख होते हैं बल्कि लंबवत होते हैं। अन्यथा, मेरा समाधान लेबल अभिविन्यास के साथ समस्या को ठीक क्यों करता है, यह आरेख को और अधिक पठनीय नहीं बनाता है ...

+1

यह एक अच्छा हैक है, धन्यवाद। मैंने इसे पहले से ही बेहतर बना दिया है। आपके पास मेरा अप-वोट है और अगर कुछ भी बेहतर नहीं होता है तो मैं समय समाप्त होने पर आपको बक्षीस स्थानांतरित करने में प्रसन्न हूं। इसके अलावा, मुझे आपका उपयोगकर्ता नाम पसंद है। –

34

मैंने एक पैकेज (riverplot) बनाया है जिसमें थोड़ा अलग है, लेकिन संकी की तुलना में ओवरलैपिंग कार्यक्षमता है इस तरह समारोह, और उत्पादन कर सकते हैं भूखंडों:

enter image description here

+0

यह वास्तव में प्रभावशाली लग रहा है! मैं इसे एएसएपी पर देख लूंगा। –

47

इस साजिश networkD3 पैकेज के माध्यम से बनाया जा सकता है। यह आपको इंटरैक्टिव शंकी आरेख बनाने की अनुमति देता है। यहां आप example पा सकते हैं। मैंने एक स्क्रीनशॉट भी जोड़ा ताकि आपको पता चल सके कि यह कैसा दिखता है।

enter image description here

+2

उदाहरण लिंक – Nelson

+1

वास्तव में टूटा हुआ है। 'Htmlwidgets' की शुरूआत के बाद से एक बेहतर विकल्प' networkD3' पैकेज से संकी साजिश है। मैंने पोस्ट अपडेट किया। – JT85

+1

क्या संख्यात्मक मानों को पूर्णांक के बजाय कैप्शन के रूप में रखना संभव है? मान सही ढंग से लिया जाता है, लेकिन कैप्शन को गोलाकार लगता है। उदाहरण: मान = 0.8 और मान = 0.2 में अलग-अलग रेखा चौड़ाई हैं, लेकिन कैप्शन दोनों के लिए '0' कहता है। –

20

rCharts के अलावा, Sankey चित्र अब भी googleVis (संस्करण> = 0.5.0) के साथ आर में उत्पन्न किया जा सकता है। उदाहरण के लिए, इस post निम्न आरेख googleVis का उपयोग कर की पीढ़ी का वर्णन करता है: enter image description here

5

//sankeybuilder.com पर एक नजर है, क्योंकि यह आपको समय के साथ अपने डेटा और प्लेबैक विविधताओं अपलोड कर सकते हैं, जहां एक तैयार समाधान जाना प्रदान करता है। संक्रमण अच्छी तरह से काम करता है (आपके प्रश्न में यूट्यूब डेमो के समान)। यदि आप SankeyTrend डेमो लोड करते हैं तो इसमें कई बार स्लॉट (डेटा के वर्ष) शामिल हैं। एक बार लोड हो जाने पर (स्वचालित रूप से sankeys बनाता है), समय स्लॉट के प्लेबैक के लिए पृष्ठ के ऊपरी दाएं कोने में प्ले बटन पर क्लिक करें, आप भी रोक सकते हैं और समय फिर से शुरू कर सकते हैं। डेमो यूआरएल यहां है: SankeyTrend आशा है कि यह सही संकी आरेख के लिए आपकी खोज में मदद करेगी।

9

आर पैकेज यह भी करेगा (?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

बस खुले एक पैकेज कार्यप्रवाह चरणों कल्पना करने के लिए एक जलोढ़ आरेख का उपयोग करता है sourced। चूंकि इतिहास को तब रखा जाता है जब जलीय रूप का उपयोग किया जाता है, किनारों में कोई क्रॉसओवर नहीं होता है।

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

enter image description here

संबंधित मुद्दे