2013-02-20 2 views
5

나는 다음과 같은 플롯에서 라벨의 밀집 이상 피할 작업입니다 :피 오버 크롤 R 그래프에서 라벨의

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) 

당신은 일부 지역이 레이블 울었다되어 볼 수 있습니다 - x 값이 동일한 경우 또는 유사합니다. 한 레이블 만 표시하려고합니다 (같은 지점에 여러 레이블이있는 경우). 예를 들어,

mydf의 $ 위치 [1 : 5] mylab을 $ mydf 모든 0,

하지만 해당 라벨 [1 : 5] -

MR1 MR2 MR3 MR4 MR5 

난 그냥 첫 번째를 표시하려면 "MR1".

마찬가지로 다음 사항은 너무 가깝습니다 (차이는 0.35). 단일 클러스터로 간주되어야하며 첫 번째 레이블이 표시됩니다. 이 방법으로 나는 레이블의 과밀을 제거 할 수있을 것이다. 그것을 어떻게 성취 할 수 있습니까? 일반적으로

enter image description here

+2

이러한 종류의 문제에 대한 자동 해결책은 없습니다.한 가지 방법이나 다른 방법으로는 "손으로"고쳐야 할 것입니다. 가까이에있는 그룹의 레이블을 하드 코딩하거나, 모든 레이블을 생략하고 나중에 이미지 편집기로 레이블을 추가하여이 문제를 해결해야합니다. – joran

+0

i-1 위치 데이터에서 i 위치를 빼고 클러스터를 작성하기위한 임계 값을 만들 수 있습니다. 그런 다음 클러스터 당 레이블을 표시하십시오 – 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

.

플롯에서 여러 줄을 사용하는 것에 대해 많은 생각을하지는 못했지만 내 코드와 추가 매개 변수를 사용하여 약간의 문제가 발생할 수 있다고 생각합니다. 색상을 사용하여 클러스터를 표시 할 수도 있습니다. 나는이 기술들이 R을위한 클러스터링 패키지의 일부에 존재한다는 것을 확신한다. ...

마커가 많이 있어도 분명히 이것은 뭉개지게 될 것이지만 클러스터가 많으면 똑같은 일이 일어난다. 우연히 있다. 어쩌면 당신은이 기술로 클러스터에 라벨을 붙이게 될까요?

+0

+1 : 매우 우아한 옵션! – Simon

+0

+1 좋은 옵션 – SHRram

2

, 내가 클러스터 라벨이 자동화 될 수없는 @Joran에 동의하지만, 당신은 그래서 클러스터의 첫 번째 레이블 라인의 그룹을 라벨링하는 것이 확인 될 것이라고 말한 일부 프로세스를 자동화 할 수 있습니다. 라인 lg2 = lng*2 뒤에 다음 코드를 넣는

아래 그림에 표시된 결과를 제공합니다

Labelled Clusters

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) 
(나는 단지 아랫 줄에 클러스터를 표시 한을 - 같은 원리를 상단 라인에도 적용 가능). hcutree()은 원하는 레이블의 해상도를 제공하기 위해 대소 문자를 구해야 할 수도 있지만이 방법은 모든 클러스터에 직접 레이블을 지정하는 것보다 쉽습니다.