2009-04-04 10 views
8

मैंने आर hclust(), as.dendrogram() और plot.dendrogram() फ़ंक्शंस का उपयोग करके this dendrogram उत्पन्न किया।मैं आर डी डेंड्रोग्राम में किनारों को रंग या सही ढंग से कैसे खींचूं?

मैंने dendrapply() फ़ंक्शन और रंगीन पत्तियों के लिए स्थानीय फ़ंक्शन का उपयोग किया, जो ठीक काम कर रहा है।

मैं एक सांख्यिकीय परीक्षण से परिणाम है कि संकेत मिलता है अगर नोड्स का एक सेट (जैसे "_+v\_stat5a\_01_" और "_+v\_stat5b\_01_" पेड़ के नीचे-दाएं कोने में के समूह) महत्वपूर्ण या महत्वपूर्ण हैं।

मेरे पास एक स्थानीय फ़ंक्शन भी है जिसका उपयोग मैं dendrapply() के साथ कर सकता हूं जो मेरे डेंड्रोग्राम में सटीक नोड पाता है जिसमें महत्वपूर्ण पत्तियां होती हैं।

मैं चाहूँगा के लिए या तो (उदाहरण के बाद):

  1. रंग किनारों कि "_+v\_stat5a\_01_" में शामिल होने और "_+v\_stat5b\_01_"; या,
  2. ड्रा एक rect() चारों ओर "_+v\_stat5a\_01_" और "_+v\_stat5b\_01_"

मैं निम्नलिखित स्थानीय समारोह ("नोड्स में leafList-मैच नोड्स में clusterList" का ब्यौरा है हालत नहीं कर रहे 'महत्वपूर्ण टी, लेकिन यह महत्वपूर्ण नोड्स पर प्रकाश डाला गया है कि):

markSignificantClusters <<- function (n) { 
    if (!is.leaf(n)) { 
    a <- attributes(n) 
    leafList <- unlist(dendrapply(n, listLabels)) 
    for (clusterIndex in 1:length(significantClustersList[[1]])) { 
     clusterList <- unlist(significantClustersList[[1]][clusterIndex]) 
     if (nodes-in-leafList-match-nodes-in-clusterList) { 
      # I now have a node "n" that contains significant leaves, and 
      # I'd like to use a dendrapply() call to another local function 
      # which colors the edges that run down to the leaves; or, draw 
      # a rect() around the leaves 
     } 
    } 
    } 
} 

इस if ब्लॉक के भीतर से, मैं dendrapply(n, markEdges) बुला की कोशिश की है, लेकिन यह काम नहीं किया:

markEdges <<- function (n) { 
    a <- attributes(n) 
    attr(n, "edgePar") <- c(a$edgePar, list(lty=3, col="red")) 
} 

मेरे आदर्श उदाहरण में, "_+v\_stat5a\_01_" और "_+v\_stat5b\_01_" को जोड़ने वाले किनारों को धराशायी और लाल रंग का रंग दिया जाएगा।

मैं भी इस if ब्लॉक के भीतर rect.hclust() उपयोग करने की कोशिश की है:

ma <- match(leafList, orderedLabels) 
rect.hclust(scoreClusterObj, h = a$height, x = c(min(ma), max(ma)), border = 2) 

लेकिन परिणाम क्षैतिज dendrograms (क्षैतिज लेबल के साथ अर्थात dendrograms) के साथ काम नहीं करता। Here is an example (निचले-दाएं कोने में लाल पट्टी नोट करें)। rect.hclust() के आयामों के बारे में कुछ सही नहीं है, और मुझे नहीं पता कि यह कैसे काम करता है, अपना खुद का संस्करण लिखने में सक्षम होने के लिए।

मैं ठीक से काम करने के लिए, या अपने खुद के rect.hclust() बराबर लिखने के लिए सक्षम होने के लिए edgePar या rect.hclust() प्राप्त करने के लिए किसी भी सलाह की सराहना करते हैं।

अद्यतन

इस सवाल पूछने के बाद से, मैं getAnywhere(rect.hclust()) इस्तेमाल किया कार्यात्मक कोड है, जो पैरामीटर गणना करता है और rect वस्तु ड्रॉ प्राप्त करने के लिए। मैंने क्षैतिज और लंबवत पत्तियों को संभालने के लिए इस फ़ंक्शन का एक कस्टम संस्करण लिखा है, और इसे dendrapply() के साथ कॉल करें।

हालांकि, कुछ प्रकार के क्लिपिंग प्रभाव हैं जो rect के हिस्से को हटा देते हैं।क्षैतिज पत्तियों के लिए (पेड़ के दाहिने तरफ खींचे जाने वाले पत्ते), rect का दायां किनारा या तो गायब हो जाता है या rect के अन्य तीन किनारों की सीमा चौड़ाई से पतला होता है। ऊर्ध्वाधर पत्तियों (पेड़ के नीचे खींचे जाने वाले पत्ते) के लिए, rect के बोटमॉस्ट किनारे को एक ही प्रदर्शन समस्या का सामना करना पड़ता है।

महत्वपूर्ण क्लस्टर को चिह्नित करने के साधन के रूप में मैंने जो किया था, वह rect की चौड़ाई को कम करना है जैसे कि मैं क्लस्टर किनारों और (क्षैतिज) पत्ती लेबल की युक्तियों के बीच एक लंबवत लाल पट्टी प्रस्तुत करता हूं।

यह क्लिपिंग समस्या को समाप्त करता है, लेकिन एक और समस्या पेश करता है, जिसमें क्लस्टर एज युक्तियों और पत्ती के लेबल के बीच की जगह केवल छह या तो पिक्सेल चौड़ी है, जिसका मेरा अधिक नियंत्रण नहीं है। यह लंबवत पट्टी की चौड़ाई को सीमित करता है।

बदतर समस्या यह है कि x -coordinate के निशान है कि जहां खड़ी धारी दो तत्वों के बीच फिट कर सकते हैं बड़ा पेड़ (par["usr"]), जो बारी में कैसे पेड़ पदानुक्रम समाप्त होता है पर निर्भर करता है की चौड़ाई के आधार पर बदल जाएगा संरचित किया जा रहा है।

मैंने एक "सुधार" लिखा है, या बेहतर है, यह x मान समायोजित करने के लिए एक हैक और rect क्षैतिज पेड़ों के लिए चौड़ाई। यह हमेशा लगातार काम नहीं करता है, लेकिन पेड़ के लिए मैं बना रहा हूं, ऐसा लगता है कि यह किनारों और लेबलों के बहुत करीब (या ओवरलैपिंग) होने से रोकता है।

आखिरकार, एक बेहतर फिक्स होगा कि rect को कैसे आकर्षित किया जाए ताकि कोई क्लिपिंग न हो। या किसी भी दिए गए पेड़ के लिए पेड़ किनारों और लेबलों के बीच विशिष्ट x स्थिति की गणना करने के लिए एक सतत तरीका है, ताकि पट्टी को केंद्र और आकार में सही तरीके से आकार दिया जा सके।

मैं रंग या रेखा शैलियों के साथ किनारों को एनोटेट करने के लिए एक विधि में भी रूचि रखूंगा।

+0

ठीक है, मैंने dendextend पैकेज में एक rect.dendrogram फ़ंक्शन लिखा था।'शाखा_attr_by_labels' नामक लेबलों के आधार पर रंगीन शाखाओं के लिए एक कार्य भी है। –

उत्तर

2

तो आपने वास्तव में लगभग पांच प्रश्न (5 +/- 3) से पूछा है। जहां तक ​​आप अपना खुद का rect.hclust लिखना चाहते हैं, स्रोत library/stats/R/identify.hclust.R में है यदि आप इसे देखना चाहते हैं।

मैं अपने आप को इस पर एक नज़र लिया और यकीन है कि यह है कि मैं क्या सोचा था कि यह अपने विवरण पढ़ने से किया करता है नहीं कर रहा हूँ - यह कई आयतों ड्राइंग किया जा रहा है, इसके अलावा, x चयनकर्ता मुश्किल के लिए कोडित प्रतीत होता है क्षैतिज टैग को अलग करें (जो आप नहीं चाहते हैं और y नहीं है)।

मैं वापस आऊंगा, लेकिन इस बीच आप (स्रोत को देखने के अलावा) कई rect.hclust को विभिन्न border= रंगों और अलग-अलग h= मानों के साथ देखने की कोशिश कर सकते हैं कि विफलता पैटर्न उभरता है या नहीं।

अद्यतन

मैं बहुत किस्मत या तो इस पर poking नहीं किया है।

क्लिपिंग के लिए एक संभावित क्लज पीछे की जगहों के साथ लेबल को पैड करना होगा और फिर अपने आयत के किनारे को थोड़ा सा लाएगा (विचार यह है कि आयताकार लाने से यह क्लिपिंग क्षेत्र से बाहर निकल जाएगा लेकिन ओवरराइट करेगा लेबल के सिरों)।

एक और विचार आयताकार (कम अल्फा) रंग के साथ आयताकार भरना होगा, जो एक बाध्यकारी बॉक्स के बजाय एक छायांकित क्षेत्र बना देगा।

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