R中的智能点标签放置

TMS*_*TMS 100 plot label r

1)是否有任何R库/函数可以在R图中实现INTELLIGENT标签放置?我尝试了一些,但它们都有问题 - 许多标签彼此重叠或其他点(或图中的其他对象,但我发现这更难处理).

2)如果没有,有什么方法可以如何舒适地帮助算法与特定问题点的标签放置?最舒适,最有效的解决方案.

您可以使用我可重复的示例来玩和测试其他可能性,看看您是否能够取得比我更好的结果:

# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
"SaxRub", "TurMer", "TurPil", "TurPhi")

# basic plot
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")
Run Code Online (Sandbox Code Playgroud)

为了标记,我尝试了这些可能性,没有人真的很好:

1)这个很可怕:

text(x, y, labels = ShortSci, cex= 0.7, offset = 10)
Run Code Online (Sandbox Code Playgroud)

2)如果您不想为所有点放置标签,但仅针对异常值,这一点很好,但是,标签通常也是错误的:

identify(x, y, labels = ShortSci, cex = 0.7)
Run Code Online (Sandbox Code Playgroud)

3)这个看起来很有意思但是标签太靠近点了; 我不得不用空格填充它们,但这没有多大帮助:

require(maptools)
pointLabel(x, y, labels = paste("  ", ShortSci, "  ", sep=""), cex=0.7)
Run Code Online (Sandbox Code Playgroud)

4)

require(plotrix)
thigmophobe.labels(x, y, labels = ShortSci, cex=0.7, offset=0.5)
Run Code Online (Sandbox Code Playgroud)

5)

require(calibrate)
textxy(x, y, labs=ShortSci, cx=0.7)
Run Code Online (Sandbox Code Playgroud)

先感谢您!

编辑: todo:尝试labcurve {Hmisc}.

jor*_*ran 48

首先,这是我解决这个问题的结果:

在此输入图像描述

我在几分钟内手动预览(OS X上非常基本的PDF /图像查看器).(编辑:工作流程正是您所期望的:我将图表保存为R中的PDF,在预览中打开它并创建带有所需标签的文本框(9pt Helvetica),然后用鼠标拖动它们直到它们看起来好的.然后我导出到PNG上传到SO.)

现在,在你屈服于迫切要求将其投入遗忘的强烈冲动之前,请留下关于如何自动完成这一过程的讽刺评论,请听我说!

寻找算法解决方案是完全正常的,(恕我直言)真的很有趣.但是,对我来说,点标签情况大致分为三类:

  1. 你有少量的积分,没有一点非常接近.在这种情况下,您在问题中列出的解决方案之一可能只需要很少的调整.
  2. 您有少量的点,其中一些点太紧密,无法为典型的算法解决方案提供良好的结果.在这种情况下,因为你只有少量的点,由专人标记他们(或者与图像编辑器或微调您的来电text)不是那个很大的努力.
  3. 你有相当多的积分.在这种情况下,你真的不应该标记它们,因为很难在视觉上处理大量的标签.

:爬上肥皂盒:

由于像我们这样的人喜欢自动化,我认为我们经常陷入这样一个陷阱,即认为生成一个好的统计图形几乎每个方面都应该是自动化的.我恭敬地(谦卑地!)不同意.

没有完美的通用统计绘图环境可以自动创建您脑海中的图片.像R,ggplot2,格子等的东西做了大部分的工作; 但是额外的一点点调整,在这里添加一条线,调整边距,可能更适合不同的工具.

:从肥皂箱爬下来:

我还要注意,我认为我们都可以得到<10-15分的散点图,即使用手也几乎不可能清晰地标记,这些可能会破坏任何人提出的自动解决方案.

最后,我想重申一下,我知道这不是你正在寻找的答案.而且我并不是说算法尝试是无用的或愚蠢的.我对这个问题进行了投票,并乐意提出有趣的算法解决方案!

我发布这个答案的原因是我认为这个问题应该是规范的"R中的点标记"问题,以备将来重复使用,我认为涉及手工标签的解决方案应该在桌面上占有一席之地,就是这样.

  • 另一种手动方式是将绘图保存为SVG并使用Inkscape编辑它,然后从中生成PDF. (10认同)

San*_*att 40

ggrepel应用于ggplot2散点图时看起来很有希望.

# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
"SaxRub", "TurMer", "TurPil", "TurPhi")


df <- data.frame(x = x, y = y, z = ShortSci)
library(ggplot2)
library(ggrepel)

ggplot(data = df, aes(x = x, y = y)) + theme_bw() + 

    geom_text_repel(aes(label = z), 
       box.padding = unit(0.45, "lines")) +

    geom_point(colour = "green", size = 3)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Joh*_*ohn 10

你试过直接标签包吗?

而且,顺便说一句,pos和offset参数可以采用向量来允许你在只有几次绘图中有合理数量的点时将它们放在正确的位置.


TMS*_*TMS 5

我找到了一些解决方案 这不是终极和理想的不幸,但它现在对我来说是最好的.它是半算法,半手动,因此与joran描绘的纯手动解决方案相比,它节省了时间.

我忽略了非常重要的?identify帮助部分!

如果在那里指定pos,则用于放置标签的算法与文本使用的算法相同,不同之处在于指针相对于所识别的点的位置确定了标识中的pos.

因此,如果您identify()在我的问题中使用解决方案,那么您可以通过不直接点击该点来影响标签的位置,而是通过相对于所需方向点击该点旁边的!!! 工作得很好!

缺点是只有4个位置(顶部,左侧,底部,右侧),但我更欣赏其他4个位置(左上角,右上角,左下角,右下角)......所以我使用它来标记它不会打扰我的点以及我在我的Powerpoint演示中直接标记的其余点,正如joran提出的那样:-)

PS:我还没有尝试过directlabels lattice/ggplot解决方案,我还是喜欢使用基本的绘图库.


Jos*_*ell 5

我编写了一个addTextLabels()在 package 中调用的 R 函数basicPlotteR。可以使用以下代码将该包直接安装到 R 库中:

install.packages("devtools")
library("devtools")
install_github("JosephCrispell/basicPlotteR")
Run Code Online (Sandbox Code Playgroud)

对于提供的示例,我使用以下代码生成下面链接的示例图。

# Load the basicPlotteR library
library(basicPlotteR)

# Create vectors storing the X and Y coordinates
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
      0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
      0.9717, 0.9357)

# Store the labels to be plotted in a vector
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
             "SaxRub", "TurMer", "TurPil", "TurPhi")

# Plot the X and Y coordinates without labels
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")

# Add non-overlapping text labels
addTextLabels(x, y, ShortSci, cex=0.9, col.background=rgb(0,0,0, 0.75), 
              col.label="white")
Run Code Online (Sandbox Code Playgroud)

它的工作原理是从精细的点网格中自动选择替代位置。首先访问网格上最近的点,如果它们不与任何绘制的点或标签重叠,则选择这些点。如果您有兴趣,请查看源代码。

示例图