geom_point의 포인트 레이블


178

내가 놀고있는 데이터는 아래 나열된 인터넷 소스에서 온 것입니다.

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

내가하고 싶은 것은이 테이블의 두 메트릭을 비교하는 2D 포인트 그래프를 만들고 각 플레이어는 그래프의 점을 나타냅니다. 다음 코드가 있습니다.

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

이것은 나에게 다음을 제공합니다.

NBA 플롯

내가 원하는 것은 점 옆에 플레이어 이름 레이블입니다. 나는 ggplot의 미학에서 레이블 기능이 나를 위해 이것을 할 것이라고 생각했지만 그렇지 않았습니다.

나는 또한 ggplot에서 작동하지 않는 것으로 보이는 text()function과 textxy()from을 시도 library(calibrate)했습니다.

이 지점에 이름 라벨을 어떻게 추가 할 수 있습니까?

답변:


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

제대로 '닷지'하지 않으면 hjust = -0.1, 인쇄 된 라벨이 데이터 포인트에서 약간 멀어 지도록 이것을 고려하십시오 .
PatrickT

레이블을 이동하려면 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 라인과 함께 사용하려면 thisthis를 참조하십시오 .

reprex 패키지 (v0.2.0)로 2019-05-01에 작성되었습니다 .


1
산뜻한! 나는 첫 음모를 정말 좋아합니다. 나는 내 데이터로 이것을 시도했고 범례가 플롯에 표시된 모양 대신 "a"를 표시한다는 점을 제외하고는 결과에 만족합니다. (나는 요소에 따라 점을 구별하기 위해 미적 모양을 사용합니다)
be guy

2
(a) geom_label_repel stackoverflow.com/questions/12041042/… 없이 플롯의 범례를 추출 하고 (b) gridExtra :: grid.arrange로 레이블이있는 플롯에 추가 하여이 문제를 해결 했습니다. 더 간단한 해결책을 알고 있다면 여전히 감사하겠습니다!
꿀벌 남자

1
@beeguy : 확실히 당신이 요구하고 있지만 최근이 커밋 본 것을 얻지 ggplot2비슷한 일을 언급 dev에 github.com/tidyverse/ggplot2/commit/...을 . 개발자 버전 ggplot2& ggrepel를 모두 설치 하여 문제가 해결되었는지 확인할 수 있습니다.
Tung

1
@beeguy : 참고로 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.