2015-09-28 86 views
2

我想使用軟件包的直接標籤來標記我的圖。不過,我希望標籤是每個點的ID。是否真的沒有辦法選擇標註哪個因素或我錯過了?選擇標籤的因子(ggplot2,directlabels)

library(ggplot2) 
library(directlabels) 
df <- structure(
    list(id = 1:10, 
     group = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
     .Label = c("A", "B"), 
     class = "factor"), 
     value1 = c(4, 1, 6, 2, 5, 7, 3, 2, 5, 8), 
     value2 = c(6, 2, 6, 2, 8, 9, 7, 5, 2, 6) 
     ), 
.Names = c("id", "group", "value1", "value2"), 
row.names = c(NA, -10L), 
class = "data.frame") 

p1 <- ggplot(df, aes(x=value1, y=value2)) + geom_point(aes(colour=group)) 
direct.label(p1) 

enter image description here

+2

爲什麼不使用'geom_text'? – Jaap

+2

'direct.label'被用作圖例的替代(即用於顯示圖形中的組),而不是在每個點上添加標籤的方式。對於點標籤,使用'geom_text'作爲Jaap在他的評論中提到的內容。 – LyzandeR

+0

@Jaap因爲我的實際情節由大約200個點組成,而'geom_text'大量標籤重疊 – beetroot

回答

5

檢查the code of direct.label.ggplot()表明geom_dl()最後被調用。此功能需要審美映射和定位方法。使用by default的定位方法是default.picker("ggplot")的返回值,它使用調用堆棧檢查,在您的情況下相當於調用defaultpf.ggplot("point",,,)。對我來說,以下工作:

p1 <- ggplot(df, aes(x=value1, y=value2)) + 
    geom_point(aes(colour=group)) + 
    geom_dl(aes(label = id), method = defaultpf.ggplot("point",,,)) 
p1 

Plot

(請注意,你不需要調用direct.label()了)

directlabels包的文件確實有點少。

+0

太棒了,謝謝!我只有一個問題。在我的實際情節中,有很多點非常接近,有些標籤現在離點很遠,有沒有辦法限制點和標籤之間的距離? – beetroot

+0

你能否在一個單獨的問題中發佈一個例子? – krlmlr

+0

根據我對直接標籤的使用經驗,通常它可以很好地避免重疊標籤;當然,除非你有很多很接近的點。在「直接標籤」中可以選擇幾種不同的間距選項,但我還沒有找到解決您所提出的問題的解決方案(即,標籤總是似乎遠離點,如果它們不是重疊)。這是針對特定問題使用廣義函數的問題。 – rhozzy

1

你必須寫一個自定義的位置的方法,像這樣:

label_all <- list(dl.trans(x = x + 0.5, y = y + 0.5), # shift every point up and right 
        gapply.fun(d)) # include all points 
direct.label(p1, method = label_all) 

enter image description here

另一個例子,見the documentation,「指定的定位方法下一個列表」。

+0

根據我的理解,OP希望利用'directlabels'提供的定位方法。您的答案只是使用默認的定位方法,在我看來,這也可以通過評論中建議的'geom_text'實現。 – krlmlr

+0

看起來你是對的,你確實給出了一個很好的答案。我也可能會在某一天使用它。 – ROLO