2013-02-20 54 views
5

मैं निम्नलिखित साजिश में लेबल की भीड़ से अधिक से बचने पर काम कर रहा हूँ:परहेज ओवर-द भीड़ आर रेखांकन में लेबल की

set.seed(123) 
position <- c(rep (0,5), rnorm (5,1,0.1), rnorm (10, 3,0.1), rnorm (3, 4, 0.2), 5, rep(7,5), rnorm (3, 8,2), rnorm (10,9,0.5), 
       rep (0,5), rnorm (5,1,0.1), rnorm (10, 3,0.1), rnorm (3, 4, 0.2), 5, rep(7,5), rnorm (3, 8,2), rnorm (10,9,0.5)) 
group <- c(rep (1, length (position)/2),rep (2, length (position)/2) ) 
mylab <- paste ("MR", 1:length (group), sep = "") 
barheight <- 0.5 

y.start <- c(group-barheight/2) 
y.end <- c(group+barheight/2) 
mydf <- data.frame (position, group, barheight, y.start, y.end, mylab) 


plot(0,type="n",ylim=c(0,3),xlim=c(0,10),axes=F,ylab="",xlab="") 
#Create two horizontal lines 
require(fields) 
yline(1,lwd=4) 
yline(2,lwd=4) 
#Create text for the lines 
text(10,1.1,"Group 1",cex=0.7) 
text(10,2.1,"Group 2",cex=0.7) 
#Draw vertical bars 
lng = length(position)/2 
lg1 = lng+1 
lg2 = lng*2 
segments(mydf$position[1:lng],mydf$y.start[1:lng],y1=mydf$y.end[1:lng]) 
segments(mydf$position[lg1:lg2],mydf$y.start[lg1:lg2],y1=mydf$y.end[lg1:lg2]) 
text(mydf$position[1:lng],mydf$y.start[1:lng]+0.65, mydf$mylab[1:lng], srt = 90) 
text(mydf$position[lg1:lg2],mydf$y.start[lg1:lg2]+0.65, mydf$mylab[lg1:lg2], srt = 90) 

आप देख सकते हैं कुछ क्षेत्रों लेबल के साथ स्पष्ट रूप से मामला कर रहे हैं - जब एक्स मूल्य एक ही है या इसी के समान। मैं केवल एक लेबल प्रदर्शित करना चाहता हूं (जब एक ही बिंदु पर एकाधिक लेबल होता है)। उदाहरण के लिए,

mydf $ स्थिति [1: 5] सभी 0,

लेकिन इसी लेबल mydf mylab डॉलर कर रहे हैं [1: 5] -

MR1 MR2 MR3 MR4 MR5 

मैं सिर्फ पहले एक प्रदर्शित करना चाहते हैं "MR1"।

इसी प्रकार निम्नलिखित बिंदु बहुत करीब हैं (0.35 का अंतर कहें), उन्हें एक क्लस्टर माना जाना चाहिए और पहला लेबल प्रदर्शित किया जाना चाहिए। इस तरह से मैं लेबल की अतिसंवेदनशीलता से छुटकारा पाने में सक्षम हो जाऊंगा। मैं इसे कैसे प्राप्त कर सकता हूं?

enter image description here

+2

इस तरह की समस्याओं का कोई स्वचालित समाधान नहीं है।एक तरफ या दूसरा आपको इसे "हाथ से" ठीक करना होगा: या तो करीबी रेखाओं के समूहों के लिए हार्ड कोडिंग लेबल, या सभी लेबलों को छोड़कर और उन्हें एक छवि संपादक के साथ जोड़कर। – joran

+0

आप i-1 स्थिति डेटा से i postion को घटा सकते हैं, फिर क्लस्टर बनाने के लिए एक थ्रेसहोल्ड बना सकते हैं। फिर शायद प्रति क्लस्टर – jon

उत्तर

10

यदि आप लेबल्स को स्थान देते हैं और कुछ अतिरिक्त लाइनें जोड़ते हैं तो प्रत्येक मार्कर लेबल कर सकते हैं।

clpl <- function(xdata, names, y=1, dy=0.25, add=FALSE){ 
    o = order(xdata) 
    xdata=xdata[o] 
    names=names[o] 
    if(!add)plot(0,type="n",ylim=c(y-1,y+2),xlim=range(xdata),axes=F,ylab="",xlab="") 
    abline(h=1,lwd=4) 
    dy=0.25 
    segments(xdata,y-dy,xdata,y+dy) 
    tpos = seq(min(xdata),max(xdata),len=length(xdata)) 
    text(tpos,y+2*dy,names,srt=90,adj=0) 
    segments(xdata,y+dy,tpos,y+2*dy) 
} 

फिर अपने डेटा का उपयोग कर:

clpl(mydf$position[lg1:lg2],mydf$mylab[lg1:lg2]) 

देता है:

marking lines with callouts

फिर आप मुख्य लाइन के नीचे लेबलिंग समूहों के बारे में सोच सकता है।

मैंने साजिश में कई लाइनें करने के लिए बहुत कुछ नहीं सोचा है, लेकिन मुझे लगता है कि मेरे कोड के साथ थोड़ा सा मिश्रण और जोड़ पैरामीटर संभव होना चाहिए। आप क्लस्टर दिखाने के लिए रंग का भी उपयोग कर सकते हैं। मुझे यकीन है कि ये तकनीक आर के लिए कुछ क्लस्टरिंग पैकेजों में मौजूद हैं ...

जाहिर है कि बहुत से मार्करों के साथ भी यह धुआं जा रहा है, लेकिन बहुत सारे क्लस्टर के साथ एक ही चीज़ जा रही है होता है। हो सकता है कि आप इस तकनीक के साथ लेबलिंग क्लस्टर को समाप्त कर दें?

+0

+1 पर एक लेबल प्रदर्शित करें: बहुत ही सुरुचिपूर्ण विकल्प! अच्छा विकल्प के लिए – Simon

+0

+1 – SHRram

2

सामान्य तौर पर, मैं @Joran साथ सहमत हैं कि क्लस्टर लेबलिंग स्वचालित नहीं किया जा सकता है, लेकिन आप ने कहा है कि क्लस्टर में पहले लेबल के साथ लाइनों के एक समूह लेबलिंग, ठीक हो जाएगा तो यह है कुछ प्रक्रिया स्वचालित करने के लिए संभव है।

लाइन lg2 = lng*2 के बाद निम्नलिखित कोड लाना परिणाम नीचे छवि में दिखाया देता है:

clust <- cutree(hclust(dist(mydf$position[1:lng])),h=0.75) 
u <- rep(T,length(unique(clust))) 
clust.labels <- sapply(c(1:lng),function (i) 
    { 
    if (u[clust[i]]) 
     { 
     u[clust[i]] <<- F 
     as.character(mydf$mylab)[i] 
     } 
    else 
     { 
     "" 
     } 
    }) 

segments(mydf$position[1:lng],mydf$y.start[1:lng],y1=mydf$y.end[1:lng]) 
segments(mydf$position[lg1:lg2],mydf$y.start[lg1:lg2],y1=mydf$y.end[lg1:lg2]) 
text(mydf$position[1:lng],mydf$y.start[1:lng]+0.65, clust.labels, srt = 90) 
text(mydf$position[lg1:lg2],mydf$y.start[lg1:lg2]+0.65, mydf$mylab[lg1:lg2], srt = 90) 

Labelled Clusters

(मैं केवल कम लाइन पर समूहों पर लेबल लगाया था - इसी सिद्धांत ऊपरी रेखा पर भी लागू किया जा सकता है)। पैरामीटर hcutree() को आपके द्वारा इच्छित लेबलों के समाधान को देने के लिए केस-दर-केस समायोजित किया जाना चाहिए, लेकिन यह दृष्टिकोण हाथ से प्रत्येक क्लस्टर को लेबल करने से कम से कम आसान है।