2015-09-28 104 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