क्या R का उपयोग करके "समांतर सेट" प्लॉट बनाना संभव है?


16

टॉरमॉड प्रश्न ( यहां पोस्ट किया गया ) के लिए धन्यवाद, मैं समानांतर सेट्स प्लॉट में आया हूं । यहाँ एक उदाहरण है कि यह कैसा दिखता है: यहाँ छवि विवरण दर्ज करें (यह टाइटैनिक डाटासेट का एक दृश्य है। उदाहरण के लिए, उदाहरण के लिए, जो महिलाएं जीवित नहीं बचीं, उनमें से अधिकांश तीसरी श्रेणी की थीं ...)

मैं आर के साथ इस तरह के एक कथानक को पुन: पेश करने में सक्षम होना पसंद करूंगा। क्या ऐसा करना संभव है?

धन्यवाद, ताल


1
ग्राफिक्स पर विचारों के लिए, मैं हमेशा आर ग्राफ गैलरी की जांच करता हूं। यहाँ कुछ ऐसा है जो कुछ इस तरह है जैसा आप पूछते हैं: आर ग्राफ़ गैलरी समानांतर । मैंने इसे टैग क्लाउड में समानांतर क्लिक करके पाया, लेकिन बेहतर विकल्प हो सकते हैं।
निक सबबे

1
धन्यवाद निक। लेकिन यह कोड के प्रमुख ट्वीकिंग के बिना श्रेणीबद्ध डेटा के लिए काम नहीं करेगा (यह संभवतः इसके साथ निर्मित कार्यों का सबसे अच्छा आधार नहीं है)। मुझे उम्मीद है कि किसी ने पहले से ही कुछ ऐसा ही किया होगा ...
ताल गैलिली

जवाबों:


25

यहां केवल बेस ग्राफिक्स का उपयोग करके एक संस्करण है, जो हेडली की टिप्पणी के लिए धन्यवाद है। (पिछले संस्करण के लिए, इतिहास संपादित करें देखें)।

तीसरा प्रयास

parallelset <- function(..., freq, col="gray", border=0, layer, 
                             alpha=0.5, gap.width=0.05) {
  p <- data.frame(..., freq, col, border, alpha, stringsAsFactors=FALSE)
  n <- nrow(p)
  if(missing(layer)) { layer <- 1:n }
  p$layer <- layer
  np <- ncol(p) - 5
  d <- p[ , 1:np, drop=FALSE]
  p <- p[ , -c(1:np), drop=FALSE]
  p$freq <- with(p, freq/sum(freq))
  col <- col2rgb(p$col, alpha=TRUE)
  if(!identical(alpha, FALSE)) { col["alpha", ] <- p$alpha*256 }
  p$col <- apply(col, 2, function(x) do.call(rgb, c(as.list(x), maxColorValue = 256)))
  getp <- function(i, d, f, w=gap.width) {
    a <- c(i, (1:ncol(d))[-i])
    o <- do.call(order, d[a])
    x <- c(0, cumsum(f[o])) * (1-w)
    x <- cbind(x[-length(x)], x[-1])
    gap <- cumsum( c(0L, diff(as.numeric(d[o,i])) != 0) )
    gap <- gap / max(gap) * w
    (x + gap)[order(o),]
  }
  dd <- lapply(seq_along(d), getp, d=d, f=p$freq)
  par(mar = c(0, 0, 2, 0) + 0.1, xpd=TRUE )
  plot(NULL, type="n",xlim=c(0, 1), ylim=c(np, 1),
       xaxt="n", yaxt="n", xaxs="i", yaxs="i", xlab='', ylab='', frame=FALSE)
  for(i in rev(order(p$layer)) ) {
     for(j in 1:(np-1) )
     polygon(c(dd[[j]][i,], rev(dd[[j+1]][i,])), c(j, j, j+1, j+1),
             col=p$col[i], border=p$border[i])
   }
   text(0, seq_along(dd), labels=names(d), adj=c(0,-2), font=2)
   for(j in seq_along(dd)) {
     ax <- lapply(split(dd[[j]], d[,j]), range)
     for(k in seq_along(ax)) {
       lines(ax[[k]], c(j, j))
       text(ax[[k]][1], j, labels=names(ax)[k], adj=c(0, -0.25))
     }
   }           
}

data(Titanic)
myt <- subset(as.data.frame(Titanic), Age=="Adult", 
              select=c("Survived","Sex","Class","Freq"))
myt <- within(myt, {
  Survived <- factor(Survived, levels=c("Yes","No"))
  levels(Class) <- c(paste(c("First", "Second", "Third"), "Class"), "Crew")
  color <- ifelse(Survived=="Yes","#008888","#330066")
})

with(myt, parallelset(Survived, Sex, Class, freq=Freq, col=color, alpha=0.2))

हारून, वाह, शानदार जवाब - काश मैं इसे दो बार वी मार्क कर पाता। धन्यवाद!
ताल गलि

2
खुश हूँ कि आपने इसे पसंद किया। वह मज़ेदार था। :) एकमात्र मुश्किल हिस्सा उन जगहों को मिल रहा है जहां सलाखों को शुरू करना चाहिए और समाप्त होना चाहिए (जो कि getpसबफंक्शन में है); बाकी सिर्फ बहुभुज खींच रहा है।
हारून ने

1
बस एक और panel.textलाइन। संपादित देखें।
हारून ने

1
आप बेस ग्राफिक्स में भी पारदर्शिता ला सकते हैं।
हैवली

2
आप सही हैं। मैं पूरी तरह से इसके बारे में भूल गया था, इसलिए चीजों को करने के जाली तरीके के लिए इस्तेमाल किया जा रहा है। जो लोग रुचि रखते हैं, उनके लिए आप अपने रंग स्ट्रिंग पर कुछ और वर्ण जोड़ते हैं, उदाहरण के लिए #FF000080,। ?rgbविवरण है।
हारून ने

12

@Aaron कोड के आधार पर मैंने "alluvial आरेख" नामक कुछ विकसित किया। देखें http://bc.bojanorama.pl/2014/03/alluvial-diagrams/ उदाहरण नीचे:

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


मैंने आपकी पोस्ट को r-blogges पर देखा है। धन्यवाद मिशाल
ताल गैलिली

1
आधिकारिक पैकेज: cran.r-project.org/web/packages/alluvial
ओरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.