ggplot2对象的动态位置(特别是geom_text)?

时间:2011-08-09 12:58:44

标签: r ggplot2

使用ArcGIS制作地图时,默认情况下,软件会自动推动点和多边形标签,以避免使用专有算法重叠。他们将此称为dynamic labelingggplot2具有position_jitter,这对于积分来说非常好(因为动态标签可能会产生系统偏差),但使用geom_text的标签则不太好。

以下是动态标记算法可能解决的抖动问题的一个示例:

library(ggplot2)
ggplot( mtcars,aes( x=wt, y=mpg, label=rownames(mtcars) ) ) +
  geom_point() +
  geom_text( position=position_jitter(h=1,w=1) )

jittered labels with problems noted

ggplot2中是否已经存在这样的动态标签功能?

如果没有,这样做有什么算法,是否可以在R中实现position_dynamic

4 个答案:

答案 0 :(得分:11)

查看新包ggrepel。 ggrepel为ggplot2提供geoms以排斥重叠的文本标签。它适用于geom_text和geom_label。

enter image description here

图来自this blog post

答案 1 :(得分:9)

我遇到了与我一直在使用的几个图的类似问题,并编写了一个使用力场模拟来调整对象位置的基本包。虽然可以进行很多改进,包括与ggplot等的集成,但它似乎完成了任务。以下说明了功能:

install.packages("FField", type = "source")
install.packages("ggplot2")
install.packages("gridExtra")
library(FField)
FFieldPtRepDemo()

答案 2 :(得分:8)

AFAIK,存在的最佳内容为directlabels,可从R-forgeCRAN获得,并提供全面的examples page

这似乎是一个很好的起点,但在我看来有以下消极方面:

  • 与分离数据和表示的ggplot哲学不同,directlabels返回ggplot对象而不是geom
  • 它仅适用于group美学,而非单个点

前段时间我已经浏览了源代码,我认为应该很容易调整代码来解决我提到的两个问题。

有一个示例说明如何在this question on SO

中使用ggplot

答案 3 :(得分:7)

这不是可以在 ggplot2 中直接使用的任何内容,但 vegan 包中的ordipointlabel()函数会尝试执行类似的操作。它将数据显示为点,并尝试使用适当的标签标记每个点,使用优化算法将标签定位在其点旁边,但不重叠其他标签和点。

?ordipointlabel提到它基于 maptools 包中的pointlabel(),这可能是寻找灵感的另一个地方。