4

この質問の言い方がわかりませんが、基本的な散布図の対応する点に線でラベルを追加しようとしています。これまでのところ、次のものがあります。

example <- data.frame(name=paste("label_",1:200,sep=""),plot=rep(FALSE,200),rank=c(1:200),score=exp(seq(6,0,length.out=200)))
example$plot[c(1:3,7,8,35,37,150:155,183)] <- TRUE

plot(x=example$score,y=example$rank,ylim=rev(range(c(1:nrow(example)))),axes=FALSE,ylab="",xlab="Score",frame.plot=FALSE)
axis(side=1,labels=TRUE)
axis(side=2,labels=example$name[which(example$plot==TRUE)],at=example$rank[which(example$plot==TRUE)],las=1,tick=FALSE)
points(x=example$score[which(example$plot==TRUE)],y=example$rank[which(example$plot==TRUE)],col="Red",cex=1.5,pch=16)

コードは次のプロットを提供します。

私が現在持っているもの。

これは、ラベルがひどく重複していることを除いて、私の目的にはうまく機能します。次のようなグラフを作成する一般的な方法を探しています。

私がしたいこと。

コードは関数内にあるため、一般的なデータセットのバリエーションに対して機能する必要があります。safeplotパッケージ内のコード ビハインドを調べていsafeますが、これまでのところ、同様の問題を解決するために行ったことを再現できません。

パッケージlinestack()内の関数も使用してみました。vegan

par(mar=c(5,10,4,2))
plot(x=example$score,y=example$rank,ylim=rev(range(c(1:nrow(example)))),axes=FALSE,ylab="",xlab="Score",frame.plot=FALSE)
axis(side=1,labels=TRUE)
points(x=example$score[which(example$plot==TRUE)],y=example$rank[which(example$plot==TRUE)],col="Red",cex=1.5,pch=16)
linestack(x=example$rank[which(example$plot==TRUE)],labels=example$name[which(example$plot==TRUE)],add=TRUE,side="left",air=1.1,at=0,hoff=2)

ただし、linestack()次のことを教えてくれました。

ここに画像の説明を入力

すべてのパラメータを変更しようとしましたが、ラベルを分離できませんでした。

4

2 に答える 2

2

ここにはいくつかの問題があります。特に、通常、クリッピングによって制限の外側 (つまり、余白) が隠されるため、プロット領域の外側に描画することはできません。また、ラベルと行を収容するために、その余白に多くのスペースを残す必要があります。

これは SO で今できることよりも大きな仕事ですが、 veganパッケージのlinestack()関数と、それがメソッドでどのように使用されているかを確認することをお勧めします。vegan:::plot.prc()

私は最近 `linestack() 関数を使用して、 glmnetパッケージのいくつかのプロットを改善するために、あなたが説明したものと非常によく似た処理を行いました。さらにヘルプが必要な場合は、コメントを返してください。例を一緒にハッキングする方法について説明します。

于 2012-09-28T14:59:33.287 に答える
1

ラベルを配置する場所を選択する方法については spread.labs、TeachingDemosパッケージの関数とplotrixパッケージの関数を参照してください。spread.labels

設定すると、、、およびその他の関数をpar(xpd=NA)使用してtext、プロット領域の外側に描画できます。linessegments

また、この関数grconvertXは、ラベルと線分の水平位置を見つけるのに役立つ場合があります。

于 2012-09-28T17:04:07.743 に答える