Одна метка для нескольких точек - PullRequest
0 голосов
/ 30 июня 2019

Я делаю диаграмму рассеяния и хочу пометить несколько точек одной меткой.

data.frame(label=rep(c("a","b","c"),2), x=rep(c(1:3),2), y=(5,4,7,2,6,9))

Как видите, метки встречаются дважды по одному и тому же значению x, отличается только y. Я хочу, чтобы и [1,5], и [1,2] были помечены с использованием одного "a", а не одного "a" для каждой координаты.

Я использую R, ggplot2 и ggrepel.

enter image description here

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Я думаю, что это то, что вам нужно.

Я использую пакет dplyr или tidyverse.

library(tidyverse)

Набор данных

dat1 <- data.frame(label=rep(c("a","b","c"),2), x=rep(c(1:3),2), y=c(5,4,7,2,6,9))

Создание набора данных дляэтикетки.Это создает набор данных меток, который будет выбирать точку маркировки в средней точке Y для данного X.

lab1 <- dat1 %>% group_by(label) %>% mutate(x = x, y = mean(y))

Это создает график, используя исходный набор данных для точек и набор данных меток для меток.

ggplot() + 
geom_point(data=dat1, aes(x=x, y=y)) +
geom_text(data=lab1, aes(x=x, y=y, label=label), size = 5) +
theme_grey()

One Label!

Вышеприведенное фактически наносит метки дважды друг на друга, но вы не можете это заметить.Если вы действительно хотели этого один раз, то можете сделать следующее и обновить предыдущий код с помощью lab2.Я также изменил размер, чтобы вы могли видеть.

lab2 <-unique(lab1)

ggplot() + 
geom_point(data=dat1, aes(x=x, y=y)) + 
geom_text(data=lab2, aes(x=x, y=y, label=label), size=10) +
theme_grey()

Если вы хотите, чтобы направление x было больше вправо или выше, вы можете обновить свой набор данных меток, добавив смещение в свой набор данных меток.

lab1 <- dat1 %>% group_by(label) %>% mutate(x = x+.3, y = mean(y) + .5)

Или вы можете сделать то же самое в самом geom_text, используя толчок.

ggplot() + geom_point(data=dat1, aes(x=x, y=y)) + 
geom_text(data=lab1, aes(x=x, y=y, label=label), size=10, nudge_x = .3, nudge_y = .5) + 
theme_grey()

Label With Offset

0 голосов
/ 30 июня 2019

Это может работать:

dat <- data.frame(label=rep(c("a","b","c"),2), x=rep(c(1:3),2), y=c(5,4,7,2,6,9))

ggplot() + geom_point(data=dat, aes(x=x, y=y)) + geom_text(data=dat[duplicated(dat$label),], aes(x=x, y=y, label=label))
...