Маркировка точек с помощью ggplot2 и directlabels

Это продолжение моего предыдущего вопроса. Хотя ответ krlmlr каким-то образом помогает решить мою проблему, остается одна проблема - метки перемещаются далеко от точек, так что становится невозможно увидеть, какая метка соответствует какой-либо точке. Кто-нибудь знает, как это исправить?

Тестовые данные

test <- structure(list(ID = c(183, 184, 185, 186, 187, 188, 189, 190, 
    191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 202, 203, 204
    ), group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 10L, 1L, 1L, 11L, 1L, 10L, 10L, 1L, 1L, 1L), .Label = c("a", 
    "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", 
    "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"), class = "factor"), 
        x = c(27.4921834914348, 25.9627681619548, 30.4138361188149, 
        29.7795838507818, 32.33351964819, 31.9669266268744, 35.4433172141507, 
        37.8161067968601, 43.1590654001956, 44.2747819266045, 46.3829222044342, 
        42.2074195880057, 45.4532493462957, 48.393281430824, 51.7145681408198, 
        51.4911582677409, 51.9582538485293, 51.3328966791848, 36.4638478746633, 
        36.6113033420253, 39.3476493044906), y = c(-40.6667236544384, 
        -39.2640436250506, -40.6403794753022, -40.907139119954, -39.9691483441288, 
        -39.7485517513382, -38.595662907188, -38.2106224386729, -37.6418188651769, 
        -32.7096448721895, -34.1161006958616, -32.2821584775403, 
        -30.8436917254975, -30.3865899667262, -30.3910690518699, 
        -26.1013343566452, -23.8437232732877, -21.5548787351057, 
        5.50922747751602, 5.64434551903915, 5.01263995541617)), row.names = c(NA, 
    -21L), .Names = c("ID", "group", "x", "y"), class = "data.frame")

library(ggplot2)
library(directlabels)

Участок с использованием geom_text - проблема: ярлыки перекрываются

ggplot(test, aes(x=x, y=y)) + 
geom_point(aes(colour=group)) + 
geom_text(aes(label=ID), show_guide=F)

введите описание изображения здесь

Сюжет в соответствии с предложением krlmlr - проблема: метки находятся далеко от точек

ggplot(test, aes(x=x, y=y)) + 
geom_point(aes(colour=group)) + 
geom_dl(aes(label = ID), method = defaultpf.ggplot("point",,,))

введите описание изображения здесь

4 ответа

Решение

Одним из способов избежать наложения (по крайней мере, до некоторой степени) было бы смещение каждой метки на величину, которая определяется ближайшей к ней точкой. Например, если ближайшая к точке точка находится непосредственно справа от нее, ее метка будет размещена слева и т. Д.

# centre and normalise variables
test$yy  <- (test$y - min(test$y)) / (max(test$y) - min(test$y))
test$xx  <- (test$x - min(test$x)) / (max(test$x) - min(test$x))
test$angle <- NA
for (i in 1:nrow(test)) {
    dx <- test[-i, ]$xx - test[i, ]$xx
    dy <- test[-i, ]$yy - test[i, ]$yy
    j <- which.min(dx ^ 2 + dy ^ 2)
    theta <- atan2((test[-i, ]$yy[j] - test[i, ]$yy), (test[-i, ]$xx[j] - test[i, ]$xx))
    test[i, ]$angle <- theta + pi
}
sc <- 0.5
test$nudge.x <- cos(test$angle) * sc
test$nudge.y <- sin(test$angle) * sc

ggplot(test, aes(x=x, y=y)) + 
    geom_point(aes(colour=group)) + 
    geom_text(aes(x = x + nudge.x, y = y + nudge.y, label = ID), size = 3, show.legend = FALSE)

Вы можете попробовать поиграть с параметром масштабирования sc (чем оно больше, тем дальше метки будут от точек), чтобы избежать наложения меток. (Я думаю, может случиться так, что не то же самое sc может применяться ко всем точкам, чтобы избежать наложений - в этом случае вам нужно изменить параметр масштабирования для каждой точки, возможно, путем определения sc с помощью dx а также dy).

Это может быть ggrepel лучше подходит для маркировки точек на диаграмме рассеяния.

library(ggplot2)  # ggrepel requires ggpot2 v2.0.0
library(ggrepel)

ggplot(test, aes(x=x, y=y)) + 


geom_text_repel(aes(label = ID, color = group),  show.legend = FALSE,
                     box.padding = unit(0.45, "lines")) +

geom_point(aes(colour=group))

введите описание изображения здесь

Может быть hjust а также vjust это то, что вы ищете?

ggplot(test, aes(x=x, y=y)) + 
  geom_point(aes(colour=group)) + 
  geom_text(aes(label=ID), show_guide=F, hjust = 1.2, vjust = 0.5)

Я думаю, что вы можете сделать это, просто настроив параметр дрожания - ... position = position_jitter..., Возможно, вам придется немного поиграть с этим, поскольку вы предоставили нам только 10% своих данных:

ggplot(test, aes(x=x, y=y)) + 
  geom_point(aes(colour=group), position= position_jitter(width= 1.5, height= 1)) + 
  geom_text(aes(label=ID), show_guide=F, hjust = 1.2, vjust = -.5,
            position= position_jitter(width= 1.5, height= 1))

Другие вопросы по тегам