web-dev-qa-db-ja.com

Rでのインテリジェントポイントラベルの配置

1)RプロットにINTELLIGENTラベル配置を実装するRライブラリ/関数はありますか?私はいくつか試してみましたが、それらはすべて問題です-多くのラベルが互いに重なり合っているか、他のポイント(またはプロット内の他のオブジェクトですが、これは処理がはるかに難しいことがわかります)。

2)そうでない場合、特定の問題のあるポイントのラベル配置でアルゴリズムを快適に助ける方法はありますか?最も快適で効率的なソリューションが必要でした。

の再現可能な例で他の可能性を再生してテストし、私が持っているよりも良い結果を達成できるかどうかを確認できます。

# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
"SaxRub", "TurMer", "TurPil", "TurPhi")

# basic plot
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")

ラベル付けのために、私はこれらの可能性を試しましたが、誰も本当に良いことはありません:

1)これはひどいです:

text(x, y, labels = ShortSci, cex= 0.7, offset = 10)

2)これは、すべてのポイントにラベルを配置するのではなく、外れ値にのみ配置したい場合に適していますが、それでもラベルはしばしば間違って配置されます。

identify(x, y, labels = ShortSci, cex = 0.7)

3)これは有望に見えましたが、ラベルがポイントに近すぎるという問題があります。私はそれらをスペースで埋めなければなりませんでしたが、これはあまり役に立ちません:

require(maptools)
pointLabel(x, y, labels = paste("  ", ShortSci, "  ", sep=""), cex=0.7)

4)

require(plotrix)
thigmophobe.labels(x, y, labels = ShortSci, cex=0.7, offset=0.5)

5)

require(calibrate)
textxy(x, y, labs=ShortSci, cx=0.7)

前もって感謝します!

EDIT:todo:try labcurve {Hmisc} .

100
TMS

解決策を見つけました!残念ながら、それは究極の理想ではありませんが、今では私にとって最も効果的なものです。アルゴリズムが半分、マニュアルが半分なので、joranがスケッチした純粋なマニュアルソリューションと比較して時間を節約できます。

私は非常に見落としていました_?identify_ヘルプの重要な部分!

ラベルを配置するために使用されるアルゴリズムは、そこでposが指定された場合にテキストで使用されるものと同じです。違いは、識別されたポイントに対するポインターの位置が識別のposを決定することです。

したがって、私の質問で書いたようにidentify()ソリューションを使用する場合、その点を直接クリックしないで、ラベルの位置に影響を与えることができますが、そのポイントの隣の希望する方向に相対的にクリックする!!!うまくいく!

欠点は、位置が4つ(上、左、下、右)しかないことですが、他の4つ(左上、右上、左下、右下)をもっと感謝します。 joranが提案したように、これを使用して、気にならないポイントと、PowerPointプレゼンテーションで直接ラベルを付けた残りのポイントにラベルを付けます。

追伸:directlabelsラティス/ ggplotソリューションはまだ試していませんが、基本的なプロットライブラリを使用することを好みます。

5
TMS

まず、この問題に対する私の解決策の結果を次に示します。

enter image description here

これをプレビュー(OS Xの非常に基本的なPDF /画像ビューアー)で数分で手作業で行いました。 (編集:ワークフローはまさにあなたが期待したものでした。プロットをRからPDFとして保存し、プレビューで開き、希望のラベルでテキストボックスを作成しました(9pt Helvetica)、マウスでドラッグして、見栄えが良くなるようにしました。その後、SOにアップロードするためにPNGにエクスポートしました。

さて、あなたはこれを忘却に下票する強い衝動に屈し、このプロセスを自動化することのポイントがいかに卑劣なコメントを残す前に、私に聞いてください!

アルゴリズムの解決策を探すことはまったく問題なく、(IMHO)本当に興味深いです。しかし、私にとって、ポイントラベル付けの状況はおおよそ3つのカテゴリに分類されます。

  1. 少数のポイントがあり、どれもひどく近くにありません。この場合、質問でリストしたソリューションの1つは、最小限の調整で機能する可能性があります。
  2. 少数のポイントがありますが、それらのいくつかは、典型的なアルゴリズムのソリューションでは良い結果を得るには密集しすぎています。この場合、ポイントの数が少ないため、それらを手動でラベル付けする(イメージエディターを使用するか、textへの呼び出しを微調整する)ことは、that muchではありません努力。
  3. かなり多数のポイントがあります。この場合、大量のラベルを視覚的に処理するのは難しいため、とにかくラベルを付けるべきではありません。

:soapboxに登る:

私たちのような人々自動化なので、私たちはしばしば、良い統計グラフィックを作成するほぼすべての側面を自動化すべきだと考えるthinkingに陥ると思います。私は敬意をもって(謙虚に!)反対します。

頭の中にある写真を自動的に作成する、完全に一般的な統計プロット環境はありません。 R、ggplot2、ラティスなどのようなものはmostの作業を行います。しかし、ここで行を追加し、マージンを調整して、微調整を少し加えると、おそらく別のツールに適しています。

:soapboxから降りる:

また、手でさえきれいにラベルを付けることはほとんど不可能である10-15ポイント未満の散布図を思い付くことができると思いますが、これらは誰かが思い付く自動ソリューションを破壊する可能性があります。

最後に、繰り返しますが、私はknowこれはあなたが探している答えではありません。そして、私はnotアルゴリズムの試みは役に立たないか愚かだと言っています。この質問に賛成票を投じたので、興味深いアルゴリズムのソリューションを喜んで支持します!

この回答を投稿した理由は、この質問が将来の複製のための標準的な「Rでのポイントラベリング」質問であるべきだと思うからです。また、手でラベルを付けるソリューションはテーブルの席に値すると思います。

47
joran

ggrepelは、ggplot2散布図。

# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
"SaxRub", "TurMer", "TurPil", "TurPhi")


df <- data.frame(x = x, y = y, z = ShortSci)
library(ggplot2)
library(ggrepel)

ggplot(data = df, aes(x = x, y = y)) + theme_bw() + 

    geom_text_repel(aes(label = z), 
       box.padding = unit(0.45, "lines")) +

    geom_point(colour = "green", size = 3)

enter image description here

39
Sandy Muspratt

directlabels パッケージを試しましたか?

そして、ところで、posおよびoffset引数はベクトルを取り、プロットの数回の実行で適切な数のポイントがある場合にそれらを正しい位置に置くことができます。

10
John

wordcloudパッケージをご覧になることをお勧めします。このパッケージは、ポイントだけでなくラベル自体に焦点を合わせていること、そしてスタイルもかなり修正されているようです。それでも、それを使用して得た結果は非常に素晴らしいものでした。また、問題のパッケージバージョンは、質問した時点でリリースされたため、まだ非常に新しいことに注意してください。

http://blog.fellstat.com/?cat=11

4
maj

パッケージplotteR内にaddTextLabels()というR関数を作成しました。パッケージは、次のコードを使用してRライブラリに直接インストールできます。

install.packages("devtools")
library("devtools")
install_github("JosephCrispell/basicPlotteR")

提供された例では、次のコードを使用して、下にリンクされている図の例を生成しました。

# Load the plotteR library
library(plotteR)

# Create vectors storing the X and Y coordinates
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
      0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
      0.9717, 0.9357)

# Store the labels to be plotted in a vector
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
             "SaxRub", "TurMer", "TurPil", "TurPhi")

# Plot the X and Y coordinates without labels
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")

# Add non-overlapping text labels
addTextLabels(x, y, ShortSci, cex=0.9, col.background=rgb(0,0,0, 0.75), 
              col.label="white")

点の細かいグリッドから別の場所を自動的に選択することで機能します。グリッド上の最も近いポイントが最初に表示され、プロットされたポイントまたはラベルと重ならない場合は選択されます。興味があるなら、ソース code を見てください。

Example Figure

3
Joseph Crispell

答えではありませんが、コメントするには長すぎます。 joranの後処理と提示されているより洗練されたアルゴリズムの間のどこかで、単純なケースで機能する非常に単純なアプローチは、データフレームへの_in-place_単純な変換を行うことです。

これは_ggplot2_で示しています。ベースRプロットよりもその構文に詳しいからです。

_df <- data.frame(x = x, y = y, z = ShortSci)
library("ggplot2")
ggplot(data = df, aes(x = x, y = y, label = z)) + theme_bw() + 
    geom_point(shape = 1, colour = "green", size = 5) + 
    geom_text(data = within(df, c(y <- y+.01, x <- x-.01)), hjust = 0, vjust = 0)
_

ご覧のとおり、この例では結果は理想的ではありませんが、いくつかの目的には十分かもしれません。そして、それは非常に楽で、通常このようなもので十分ですwithin(df, y <- y+.01)

enter image description here

2
PatrickT