2013-02-20 12 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値が同じであればまたは類似。 1つのラベルだけを表示したい(同じポイントに複数のラベルがある場合)。例えば、

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ポジションを引くことができます。次に、クラスタを作成するためのしきい値を設定します。おそらくクラスターあたりのラベルを表示する – 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

私はプロットで複数の行をすることはあまり考えていませんでしたが、私はコードとaddパラメータを少し混乱させて考えなければなりません。色を使ってクラスタを表示することもできます。私はかなりこれらのテクニックがRのクラスタ化パッケージのいくつかに存在すると確信しています...

明らかに多くのマーカーでは、これもスマッシュになるでしょうが、多くのクラスタでは同じことが起こります起こる。たぶん、あなたはこのテクニックでクラスターにラベルを付けるでしょうか?

+0

+1:非常にエレガントなオプション! – Simon

+0

+1素晴らしいオプション – SHRram

2

、私は、クラスタ標識が自動化することができないという@Joranに同意するが、あなたはそれがあるように、クラスタの最初のラベルを持つ行のグループにラベルを付けることは、OKだろうと言ってきましたいくつかのプロセスを自動化することが可能です。ライン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()の場合、必要に応じてラベルの解像度を調整する必要がありますが、この方法はすべてのクラスタに手作業でラベルを付けるよりも簡単です。

関連する問題