在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美学中的标签功能可以为我做到这一点,但事实并非如此。

我还尝试了text()function和textxy()from中的函数library(calibrate),但它们都似乎不适用于ggplot。

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

Answers:


279

geom_textaes标签一起使用。您可以玩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
有什么办法可以移动标签(稍微回避标签),以免标签重叠吗?
托马斯·布朗

2
我认为内部没有任何简单的解决方案ggplot2。也许可以帮助您。
agstudy

1
有什么方法可以只标记高于某个值的点,例如,在上图中的PTS大于24?
ONeillMB1 2015年

如果没有适当的“闪避”,请考虑这样做,hjust = -0.1以使打印的标签离数据点稍远一些。
PatrickT '16

要移动标签,请考虑使用ggrepel
荷马·怀特

91

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)

reprex包(v0.2.0)创建于2019-05-01 。


1
整齐!我真的很喜欢第一个情节。我对数据进行了尝试,并对结果感到满意,只是图例显示的是“ a”而不是图形中显示的形状。(我使用美学形状根据一个因素来区分点)
蜜蜂家伙

2
我现在解决这个问题的(a)对情节的传说没有geom_label_repel stackoverflow.com/questions/12041042/...并将其添加然后用gridExtra :: grid.arrange与标签曲线(B)。如果您知道一个更简单的解决方案,我将不胜感激!
蜜蜂家伙

1
@beeguy:不确定我能得到您的要求,但是最近我发现对ggplot2dev 的提交提到了类似的东西github.com/tidyverse/ggplot2/commit/…。您可以尝试同时安装ggplot2&的两个开发人员版本,ggrepel以查看问题是否得到解决
Tung

1
@beeguy:fyi还有一个lemon软件包非常擅长操纵剧情传说。

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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.