संके डायग्राम आर में?


86

मैं अपने डेटा प्रवाह को आर में एक सेंकेग्राम के साथ कल्पना करने की कोशिश कर रहा हूं।

मुझे यह ब्लॉग पोस्ट एक आर स्क्रिप्ट से जुड़ा हुआ मिला जो एक सैंकेय आरेख का उत्पादन करता है, दुर्भाग्य से यह काफी कच्चा है और कुछ हद तक सीमित है (नमूना कोड और डेटा के लिए नीचे देखें)।

क्या किसी को अन्य लिपियों का पता है - या शायद एक पैकेज भी - जो अधिक विकसित है? मेरा अंतिम लक्ष्य आरेखीय घटकों के सापेक्ष आकार द्वारा डेटा प्रवाह और प्रतिशत दोनों की कल्पना करना है, जैसे कि सैंके डायग्राम्स के इन उदाहरणों में

मैंने r- हेल्प लिस्ट पर कुछ इसी तरह का प्रश्न पोस्ट किया था , लेकिन दो सप्ताह के बाद बिना किसी प्रतिक्रिया के मैं यहां अपनी किस्मत स्टैकओवरफ्लो पर आज़मा रहा हूं।

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

पुनश्च। मुझे समानांतर सेट प्लॉट के बारे में पता है , लेकिन वह नहीं है जो मैं देख रहा हूं।

# 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 आरेख का उत्पादन किया


2
तीर मुझे ठीक लगते हैं, ऐसा लगता है जैसे आप पाठ को ठीक कर रहे हैं और आप अंदर हैं?
रोमन लुसट्रिक

@ रमन लुसेक्रिक, मैं मानता हूं, यह आरेख बिल्कुल भी बुरा नहीं है, लेकिन मेरे आर कौशल अभी भी सीमित हैं इसलिए मैं वास्तव में आर में इतनी अच्छी ट्यूनिंग नहीं कर सकता, अगर आपका मतलब था? मैं निश्चित रूप से इसे Adobe Illustrator में कर सकता हूं, या ऐसा कुछ हो सकता है, लेकिन यह प्रतिलिपि प्रस्तुत करने योग्य अनुसंधान के सिद्धांत को तोड़ देगा, जो मेरे लिए किसी भी (शैक्षणिक) काम में एक केंद्रीय तत्व है। क्या आपने पोस्ट में मेरे द्वारा जुड़े उदाहरणों को देखा ?
एरिक फेल

मुझे एहसास है कि मेरा सवाल इस अर्थ में अच्छा सवाल नहीं है कि यह एक विशिष्ट प्रोग्रामिंग समस्या नहीं है और सीधे व्यावहारिक नहीं है, लेकिन कुछ हद तक खुले प्रश्न ( एफएक्यू से )। इस प्रश्न का उत्तर देने के लिए या तो R में अलग-अलग रेखांकन विकल्पों पर निगरानी रखनी होगी और उस आधार पर मेरे प्रश्न का उत्तर नहीं के साथ देना होगा, ऐसा कोई स्क्रैप या पैकेज नहीं है जो अधिक विकसित हो , या किसी को पता होना चाहिए अधिक विकसित विधि Sankey Diagrams का R में निर्माण करती है और इसे इंगित करती है। शायद इस सवाल को पोस्ट करने के लिए एक बेहतर जगह है?
एरिक फेल

1
एक ही जगह पर मैं आ सकता हूँ शायद है crossvalidated.com।
रोमन लुसट्रिक

आर-मेलिंग सूची के बारे में कैसे? 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 17

1
वास्तव में। एक बेहतर विकल्प की शुरुआत के बाद पैकेज htmlwidgetsसे sankey साजिश है networkD3। मैंने पोस्ट अपडेट की।
जोनास टुंडो

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

यदि आप अपने स्वयं के डेटा के कुछ नमूने के साथ इसे पुन: पेश करने का प्रयास करते हैं, तो सुनिश्चित करें कि पहला स्रोत आईडी 0 से शुरू होता है और स्रोत और लक्ष्य आईडी क्रमिक हैं
रिचर्ड

43

मैंने एक पैकेज ( रिवरप्लॉट ) बनाया है, जिसमें सैंके फंक्शन की तुलना में थोड़ा अलग, लेकिन अतिव्यापी कार्यक्षमता है, और इस तरह से प्लॉट तैयार किए जा सकते हैं:

यहाँ छवि विवरण दर्ज करें


यह वास्तव में प्रभावशाली लग रहा है! मैं इसे ASAP पर एक नज़र डालूँगा।
एरिक फेल

39

यदि आप इसे R के साथ करना चाहते हैं, तो आपकी सबसे अच्छी बोली @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)

यहाँ छवि विवरण दर्ज करें

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


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

24

RCharts के अलावा , Sankey डायग्राम अब R में googleVis (संस्करण> = 0.5.0) के साथ भी उत्पन्न किया जा सकता है । उदाहरण के लिए, यह पोस्ट googleVis का उपयोग करते हुए निम्नलिखित आरेख की पीढ़ी का वर्णन करती है: यहाँ छवि विवरण दर्ज करें


15

आर के पैकेज भी (से ?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

इन परिभाषाओं द्वारा इस फ़ंक्शन को देखते हुए , समानांतर सेट प्लॉट की तरह, प्रवाह को विभाजित करने और संयोजित करने की क्षमता का अभाव है (यानी एक से अधिक संक्रमण के माध्यम से)।

चूँकि Sankey आरेखों को भारित रेखांकन निर्देशित किया जाता है , qgraph जैसा पैकेज उपयोगी हो सकता है।

SankeyRसमारोह स्पष्ट लेबल यदि आप प्रकार पाठ के रूप में अवरोही क्रम में घाटा अतिव्यापी बिना तीर सिर के करीब रखा गया है प्रदान करता है।


1
छंटाई अवरोही क्रम में घाटा चित्र के दिशात्मक गुणवत्ता टूट जाएगा। यदि आप मेरे द्वारा प्रस्तुत किए गए आरेख को करीब से देखेंगे तो आप देखेंगे कि समय x- अक्ष पर है, इसलिए वर्तमान क्रम। मैं sankey-diagrams.com से अवगत हूँ और इस पर लेख, मेरा पहला विचार जब मैंने देखा कि वेबसाइट op r को खोलना था और ggplot2 में एक अच्छा Sankey आरेख तैयार करना था
एरिक फेल

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

2018-11-13 को रेप्रेक्स पैकेज (v0.2.1.9000) द्वारा बनाया गया


1

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

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

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.