내가 놀고있는 데이터는 아래 나열된 인터넷 소스에서 온 것입니다.
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()
이것은 나에게 다음을 제공합니다.
내가 원하는 것은 점 옆에 플레이어 이름 레이블입니다. 나는 ggplot의 미학에서 레이블 기능이 나를 위해 이것을 할 것이라고 생각했지만 그렇지 않았습니다.
나는 또한 ggplot에서 작동하지 않는 것으로 보이는 text()
function과 textxy()
from을 시도 library(calibrate)
했습니다.
이 지점에 이름 라벨을 어떻게 추가 할 수 있습니까?
답변
레이블 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)
답변
이 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
라인과 함께 사용하려면 this 와 this를 참조하십시오 .
reprex 패키지 (v0.2.0)로 2019-05-01에 작성되었습니다 .
답변
위의 예와 같이 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))