在geom_point中标记点

Gre*_*mon 153 plot r ggplot2 labeling ggrepel

我正在玩的数据来自下面列出的互联网资源

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep=",")
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建一个2D点图,比较该表中的两个指标,每个玩家在图上表示一个点.我有以下代码:

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

这给了我以下内容:

NBA情节

我想要的是一个玩家名字的标签就在点旁边.我认为ggplot美学中的标签功能会为我做这个,但事实并非如此.

我也尝试过text()函数和textxy()函数library(calibrate),它们似乎都不适用于ggplot.

如何为这些点添加名称标签?

ags*_*udy 246

使用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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:仅标记高于特定阈值的值:

  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)
Run Code Online (Sandbox Code Playgroud)

带条件标签的图表

  • @ user2145578你可以看到我的编辑. (5认同)
  • 是否有任何方法可以移动标签(稍微躲闪它们),以便它们不重叠? (4认同)
  • 要移动标签,请考虑 [ggrepel](https://cran.r-project.org/web/packages/ggrepel/index.html)。 (3认同)
  • 我不认为`ggplot2`中有任何简单的解决方案.也许[this](http://stackoverflow.com/questions/7611169/intelligent-point-label-placement-in-r)可以帮到你. (2认同)

Tun*_*ung 63

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

### 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)
Run Code Online (Sandbox Code Playgroud)

reprex包(v0.2.0)于2018-05-11创建.

  • 我现在通过(a)提取没有 geom_label_repel 的图例来解决这个问题 /sf/ask/842872971/?utm_medium=organic&amp;utm_source= google_rich_qa&amp;utm_campaign=google_rich_qa 和 (b) 然后将它与 gridExtra::grid.arrange 添加到带有标签的绘图中。如果您知道更简单的解决方案,我仍然会很感激! (2认同)

小智 8

可以在标记之前根据某些阈值预先过滤数据,而不是像上例中那样使用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))
Run Code Online (Sandbox Code Playgroud)