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.)
现在,在你屈服于迫切要求将其投入遗忘的强烈冲动之前,请留下关于如何自动完成这一过程的讽刺评论,请听我说!
寻找算法解决方案是完全正常的,(恕我直言)真的很有趣.但是,对我来说,点标签情况大致分为三类:
text)不是那个很大的努力.:爬上肥皂盒:
由于像我们这样的人喜欢自动化,我认为我们经常陷入这样一个陷阱,即认为生成一个好的统计图形几乎每个方面都应该是自动化的.我恭敬地(谦卑地!)不同意.
没有完美的通用统计绘图环境可以自动创建您脑海中的图片.像R,ggplot2,格子等的东西做了大部分的工作; 但是额外的一点点调整,在这里添加一条线,调整边距,可能更适合不同的工具.
:从肥皂箱爬下来:
我还要注意,我认为我们都可以得到<10-15分的散点图,即使用手也几乎不可能清晰地标记,这些可能会破坏任何人提出的自动解决方案.
最后,我想重申一下,我知道这不是你正在寻找的答案.而且我并不是说算法尝试是无用的或愚蠢的.我对这个问题进行了投票,并乐意提出有趣的算法解决方案!
我发布这个答案的原因是我认为这个问题应该是规范的"R中的点标记"问题,以备将来重复使用,我认为涉及手工标签的解决方案应该在桌面上占有一席之地,就是这样.
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)
我找到了一些解决方案 这不是终极和理想的不幸,但它现在对我来说是最好的.它是半算法,半手动,因此与joran描绘的纯手动解决方案相比,它节省了时间.
我忽略了非常重要的?identify帮助部分!
如果在那里指定pos,则用于放置标签的算法与文本使用的算法相同,不同之处在于指针相对于所识别的点的位置确定了标识中的pos.
因此,如果您identify()在我的问题中使用解决方案,那么您可以通过不直接点击该点来影响标签的位置,而是通过相对于所需方向点击该点旁边的!!! 工作得很好!
缺点是只有4个位置(顶部,左侧,底部,右侧),但我更欣赏其他4个位置(左上角,右上角,左下角,右下角)......所以我使用它来标记它不会打扰我的点以及我在我的Powerpoint演示中直接标记的其余点,正如joran提出的那样:-)
PS:我还没有尝试过directlabels lattice/ggplot解决方案,我还是喜欢使用基本的绘图库.
我编写了一个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)
它的工作原理是从精细的点网格中自动选择替代位置。首先访问网格上最近的点,如果它们不与任何绘制的点或标签重叠,则选择这些点。如果您有兴趣,请查看源代码。
