使用ArcGIS制作地图时,默认情况下,软件会自动推动点和多边形标签,以避免使用专有算法重叠。他们将此称为dynamic labeling。 ggplot2
具有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) )
ggplot2中是否已经存在这样的动态标签功能?
如果没有,这样做有什么算法,是否可以在R中实现position_dynamic
?
答案 0 :(得分:11)
答案 1 :(得分:9)
我遇到了与我一直在使用的几个图的类似问题,并编写了一个使用力场模拟来调整对象位置的基本包。虽然可以进行很多改进,包括与ggplot等的集成,但它似乎完成了任务。以下说明了功能:
install.packages("FField", type = "source")
install.packages("ggplot2")
install.packages("gridExtra")
library(FField)
FFieldPtRepDemo()
答案 2 :(得分:8)
AFAIK,存在的最佳内容为directlabels
,可从R-forge和CRAN获得,并提供全面的examples page。
这似乎是一个很好的起点,但在我看来有以下消极方面:
ggplot
哲学不同,directlabels
返回ggplot对象而不是geom group
美学,而非单个点前段时间我已经浏览了源代码,我认为应该很容易调整代码来解决我提到的两个问题。
有一个示例说明如何在this question on SO
中使用ggplot
答案 3 :(得分:7)
这不是可以在 ggplot2 中直接使用的任何内容,但 vegan 包中的ordipointlabel()
函数会尝试执行类似的操作。它将数据显示为点,并尝试使用适当的标签标记每个点,使用优化算法将标签定位在其点旁边,但不重叠其他标签和点。
?ordipointlabel
提到它基于 maptools 包中的pointlabel()
,这可能是寻找灵感的另一个地方。