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)

x 値が同じか類似している場合、一部の領域がラベルで混雑していることがわかります。ラベルを1つだけ表示したいだけです(同じポイントに複数のラベルがある場合)。例えば、

mydf$position[1:5] はすべて 0 です。

ただし、対応するラベル mydf$mylab[1:5] -

 MR1  MR2  MR3  MR4  MR5 

最初の「MR1」を表示したいだけです。

同様に、次の点は近すぎます (0.35 の差など)。それらは単一のクラスターと見なされ、最初のラベルが表示されます。このようにして、ラベルの過密を取り除くことができます。どうすれば達成できますか?

ここに画像の説明を入力

4

2 に答える 2

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)

ラベル付きクラスター

(下の行のクラスターにのみラベルを付けました。同じ原則を上の行にも適用できます)。のパラメーターhcutree()、必要なラベルの解像度を得るためにケースバイケースで調整する必要がある場合がありますが、このアプローチは、すべてのクラスターを手動でラベル付けするよりも少なくとも簡単です。

于 2013-02-20T04:17:35.630 に答える