geom_pointのポイントにラベルを付ける


178

私が遊んでいるデータは、以下にリストされているインターネットソースからのものです

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep=",")

私がやりたいことは、この表の2つのメトリックを比較する2Dポイントグラフを作成し、各プレーヤーがグラフ上のドットを表すことです。私は次のコードを持っています:

nbaplot <- ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name)) + 
                  geom_point() 

これは私に次を与えます:

NBAプロット

私が欲しいのは、ドットのすぐ隣にあるプレイヤーの名前のラベルです。ggplotの美学のラベル機能がこれを行うと私は思ったが、実際はそうしなかった。

私はtext()関数とtextxy()からの関数も試しましたがlibrary(calibrate)、どちらもggplotで動作しないようです。

これらのポイントに名前ラベルを追加するにはどうすればよいですか?

回答:


280

ラベルgeom_text付きのを使用しaesます。で遊んでhjust, vjustテキストの位置を調整できます。

ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name))+
  geom_point() +geom_text(aes(label=Name),hjust=0, vjust=0)

ここに画像の説明を入力してください

編集:特定のしきい値を超える値のみにラベルを付けます。

  ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name))+
  geom_point() +
  geom_text(aes(label=ifelse(PTS>24,as.character(Name),'')),hjust=0,vjust=0)

条件付きラベル付きのグラフ


4
ラベルが重ならないように、ラベルをずらす(少しずつかわす)方法はありますか?
Thomas Browne

2
内に簡単な解決策はないと思いますggplot2。多分これはあなたを助けることができます。
agstudy

1
特定の値を超えるポイントのみにラベルを付ける方法はありますか(たとえば、上記のプロットで24より大きいPTSなど)。
ONeillMB1 2015年

適切に「覆い焼き」する前に、これhjust = -0.1を考慮して、印刷されたラベルをデータポイントから少しだけ離してください。
PatrickT 2016

ラベルを移動するには、ggrepelを検討してください
ホーマーホワイト

92

ggrepelパッケージは、互いに離れるの重複テキストラベルをはじくための素晴らしい作品。geom_label_repel()(テキストの周りに長方形を描く)またはgeom_text_repel()関数を使用できます。

library(ggplot2)
library(ggrepel)

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep = ",")

nbaplot <- ggplot(nba, aes(x= MIN, y = PTS)) + 
  geom_point(color = "blue", size = 3)

### geom_label_repel
nbaplot + 
  geom_label_repel(aes(label = Name),
                  box.padding   = 0.35, 
                  point.padding = 0.5,
                  segment.color = 'grey50') +
  theme_classic()

ここに画像の説明を入力してください

### geom_text_repel
# only label players with PTS > 25 or < 18
# align text vertically with nudge_y and allow the labels to 
# move horizontally with direction = "x"
ggplot(nba, aes(x= MIN, y = PTS, label = Name)) + 
  geom_point(color = dplyr::case_when(nba$PTS > 25 ~ "#1b9e77", 
                                      nba$PTS < 18 ~ "#d95f02",
                                      TRUE ~ "#7570b3"), 
             size = 3, alpha = 0.8) +
  geom_text_repel(data          = subset(nba, PTS > 25),
                  nudge_y       = 32 - subset(nba, PTS > 25)$PTS,
                  size          = 4,
                  box.padding   = 1.5,
                  point.padding = 0.5,
                  force         = 100,
                  segment.size  = 0.2,
                  segment.color = "grey50",
                  direction     = "x") +
  geom_label_repel(data         = subset(nba, PTS < 18),
                  nudge_y       = 16 - subset(nba, PTS < 18)$PTS,
                  size          = 4,
                  box.padding   = 0.5,
                  point.padding = 0.5,
                  force         = 100,
                  segment.size  = 0.2,
                  segment.color = "grey50",
                  direction     = "x") +
  scale_x_continuous(expand = expand_scale(mult = c(0.2, .2))) +
  scale_y_continuous(expand = expand_scale(mult = c(0.1, .1))) +
  theme_classic(base_size = 16)

編集:ggrepel行で使用するには、これこれを参照してください。

reprexパッケージ(v0.2.0)によって2019-05-01に作成されました。


1
きちんと!私は最初のプロットが本当に好きです。私のデータでこれを試しましたが、凡例がプロットに表示されている形状ではなく「a」を示していることを除いて、結果に満足しています。(私は要因に応じてポイントを区別するために美的形状を使用しています)
蜂の男

2
私はこの問題を(a)geom_label_repelなしでプロットの凡例を抽出し、stackoverflow.com / questions / 12041042 /… と(b)次にそれをgridExtra :: grid.arrangeでラベル付きのプロットに追加することでこの問題を解決しました。より簡単な解決策を知っているなら、私はそれを感謝します!
ミツバチ

1
@beeguy:私があなたが求めているものを手に入れているかわかりませんが、最近github.com/tidyverse/ggplot2/commit/…にggplot2類似したことを言及しているdevのコミットを見ました。&の両方の開発バージョンをインストールして、問題が解決したかどうかを確認することができますggplot2ggrepel
Tung

1
@beeguy:fyi lemonプロットの凡例の操作に非常に優れたパッケージもあります。
Tung

1
ヒントをありがとう
ハチの男

10

上記の例のようにifelseを使用する代わりに、いくつかのしきい値に基づいてラベル付けする前にデータを事前フィルターすることもできます。これにより、プロットデバイスの多くの作業を節約できます。

xlimit <- 36
ylimit <- 24
ggplot(myData)+geom_point(aes(myX,myY))+
    geom_label(data=myData[myData$myX > xlimit & myData$myY> ylimit,], aes(myX,myY,myLabel))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.