2015-10-21 200 views
1

這是我的earlier question的後續行動。雖然krlmlr的答案有助於解決我的問題,但還有一個問題 - 標籤遠離點,以至於無法看到哪個標籤對應於哪個點。有誰知道如何解決這一問題?標籤點與ggplot2和直接標籤

測試數據

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) 

enter image description here

情節的建議通過krlmlr - 問題:標籤遠離點

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

enter image description here

回答

3

一來避免重複方式(在一定程度上至少)將將每個標籤抵消由其最近點確定的數量。因此,舉例來說,如果一個點的最鄰近的點是直接向它的右邊,其標籤會被放在左邊,等

# 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) 

enter image description here

你可以嘗試用縮放參數sc玩弄(它越大,標籤離點越遠)以避免重疊標籤。 (我想可能會發生不同的sc可以應用於所有點以避免重疊 - 在這種情況下,您需要更改每個點的縮放參數,可能通過使用dxdy定義sc)。

2

也許hjustvjust是你在找什麼?

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) 

enter image description here

+0

我的實際地塊包括100-200分,這幾乎是不可能找到hjust /一個值vjust避免任何重疊,因此我需要一個更「動態」的方式。 – beetroot

1

我想你可以通過調整參數抖動做到這一點 - ... 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)) 

enter image description here

5

它可能是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)) 

enter image description here