У меня есть довольно плотная диаграмма рассеяния, которую я строю с помощью R 'ggplot2', и я хочу пометить подмножество точек, используя 'ggrepel'. Моя проблема в том, что я хочу построить ВСЕ точки на диаграмме рассеяния, но пометить только подмножество с помощью ggrepel, и когда я это сделаю, ggrepel не учитывает другие точки на графике при вычислении места для размещения меток, что приводит к на метки, которые перекрывают другие точки на графике (которые я не хочу маркировать).
Вот пример сюжета, иллюстрирующий проблему.
# generate data:
library(data.table)
library(stringi)
set.seed(20180918)
dt = data.table(
name = stri_rand_strings(3000,length=6),
one = rnorm(n = 3000,mean = 0,sd = 1),
two = rnorm(n = 3000,mean = 0,sd = 1))
dt[, diff := one -two]
dt[, diff_cat := ifelse(one > 0 & two>0 & abs(diff)>1, "type_1",
ifelse(one<0 & two < 0 & abs(diff)>1, "type_2",
ifelse(two>0 & one<0 & abs(diff)>1, "type_3",
ifelse(two<0 & one>0 & abs(diff)>1, "type_4", "other"))))]
# make plot
ggplot(dt, aes(x=one,y=two,color=diff_cat))+
geom_point()
Если я рисую только подмножество точек, которые хочу пометить, то ggrepel сможет разместить все метки без перекрытия по отношению к другим точкам и меткам.
ggplot(dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))],
aes(x=one,y=two,color=diff_cat))+
geom_point()+
geom_text_repel(data = dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))],
aes(x=one,y=two,label=name))
Однако, когда я хочу отобразить это подмножество данных И исходные данные одновременно, я получаю точки перекрытия с метками:
# now add labels to a subset of points on the plot
ggplot(dt, aes(x=one,y=two,color=diff_cat))+
geom_point()+
geom_text_repel(data = dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))],
aes(x=one,y=two,label=name))
Как сделать так, чтобы метки для подмножества точек не перекрывали точки из исходных данных?