web-dev-qa-db-ja.com

geom_pointでラベルポイント

私が遊んでいるデータは、下記のインターネットの情報源から来ています。

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 Plot

私が欲しいのは、ドットの隣にあるプレイヤーの名前のラベルです。私はggplotの美学の中のラベル機能が私のためにこれをするだろうと思いました、しかし、それはしませんでした。

text()からtextxy()関数とlibrary(calibrate)関数も試してみましたが、どちらもggplotで動作するようには見えません。

これらのポイントに名前ラベルを追加する方法

142
Green Demon

aesラベルを付けてgeom_textを使用します。 hjust, vjustを使ってテキストの位置を調整することができます。

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

enter image description here

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

  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)

chart with conditional labels

227
agstudy

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()

enter image description here

### 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)

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

52
Tung

上記の例のように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))
6
Patrick Dolan