R中的智能点标签放置
1) 是否有任何R库/函数可以在R图中实现智能标签放置?我尝试了一些,但它们都有问题-许多标签相互重叠或其他点(或绘图中的其他对象,但我发现这更难处理) 2) 如果没有,是否有任何方法可以轻松地帮助算法放置特定问题点的标签?需要最舒适、最高效的解决方案 您可以使用我的可复制示例玩和测试其他可能性,看看您是否能够获得比我更好的结果:R中的智能点标签放置,r,plot,label,R,Plot,Label,1) 是否有任何R库/函数可以在R图中实现智能标签放置?我尝试了一些,但它们都有问题-许多标签相互重叠或其他点(或绘图中的其他对象,但我发现这更难处理) 2) 如果没有,是否有任何方法可以轻松地帮助算法放置特定问题点的标签?需要最舒适、最高效的解决方案 您可以使用我的可复制示例玩和测试其他可能性,看看您是否能够获得比我更好的结果: # data x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 0.905
# 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")
对于标签,我尝试了这些可能性,没有人是真正好的:
1) 这个很可怕:
text(x, y, labels = ShortSci, cex= 0.7, offset = 10)
2) 如果您不想为所有点放置标签,而只是为每个点放置标签,则此选项很好
异常值,但标签通常放置错误:
identify(x, y, labels = ShortSci, cex = 0.7)
3) 这一款看起来很有希望,但也存在标签太靠近屏幕的问题
点数;我不得不用空格填充它们,但这没有多大帮助:
require(maptools)
pointLabel(x, y, labels = paste(" ", ShortSci, " ", sep=""), cex=0.7)
(四)
(五)
提前谢谢你
编辑:待办事项:尝试。您尝试过该软件包吗
顺便说一句,pos和offset参数可以采用向量,以便在几次绘图中有合理数量的点时,将它们置于正确的位置。首先,以下是我解决此问题的结果: 我在预览版(OSX上非常基本的PDF/图像查看器)中仅用了几分钟就完成了这项工作。(编辑:工作流程正是您所期望的:我从R以PDF格式保存绘图,在预览中打开它,并创建带有所需标签的文本框(9pt Helvetica),然后用鼠标拖动它们,直到它们看起来很好。然后我导出到PNG以上载到SO。) 现在,在你屈服于强烈的冲动,投票否决这项法案,将其抛诸脑后,并就如何实现这一过程的自动化发表尖刻的评论之前,请听我说完 寻找算法解决方案是完全好的,而且(IMHO)非常有趣。但对我来说,点标记情况大致可分为三类:
文本的调用)并没有那么大的工作量
我还要指出的是,我认为我们都可以得出散点图,我找到了一些解决方案!不幸的是,这并不是终极的、理想的,但它现在对我来说是最有效的。它是半算法的,半人工的,所以与joran绘制的纯人工解决方案相比,它节省了时间 我忽略了
?识别帮助中非常重要的部分强>
用于放置标签的算法与文本使用的算法相同
此处指定了pos,不同之处在于
相对于标识点的指针确定标识中的位置
因此,如果您使用我在问题中所写的identify()
解决方案,那么您可以通过不直接单击该点,而是在该点旁边相对地按所需方向单击来影响标签的位置效果非常好
缺点是只有4个位置(上、左、下、右),但我更喜欢其他4个位置(左上、右上、左下、右下)。。。所以我用它来标记我不感兴趣的点,以及我在Powerpoint演示文稿中直接标记的其他点,正如joran所建议的:-)
注:我还没有尝试directlabels lattice/ggplot解决方案,我仍然更喜欢使用基本绘图库。我建议您看看wordcloud
软件包。我知道这个软件包并不完全关注点,而是关注标签本身,而且风格似乎相当固定。但是,我使用它得到的结果还是非常惊人的。还请注意,所讨论的软件包版本是在您提出问题时发布的,因此它仍然是非常新的
不是答案,但太长,无法发表评论。一种非常简单的方法可以处理简单的情况,介于joran的后处理和已经介绍的更复杂的算法之间,就是对数据帧进行就地
简单转换
我用ggplot2
来说明这一点,因为我比基本R图更熟悉这种语法
df <- data.frame(x = x, y = y, z = ShortSci)
library("ggplot2")
ggplot(data = df, aes(x = x, y = y, label = z)) + theme_bw() +
geom_point(shape = 1, colour = "green", size = 5) +
geom_text(data = within(df, c(y <- y+.01, x <- x-.01)), hjust = 0, vjust = 0)
dfggrepel
应用于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)
#数据
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(“莫塔尔布”、“普鲁莫德”、“埃瑞鲁布”、“卢萨梅格”、“凤凰”、“凤凰”,
df <- data.frame(x = x, y = y, z = ShortSci)
library("ggplot2")
ggplot(data = df, aes(x = x, y = y, label = z)) + theme_bw() +
geom_point(shape = 1, colour = "green", size = 5) +
geom_text(data = within(df, c(y <- y+.01, x <- x-.01)), hjust = 0, vjust = 0)
# 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)
install.packages("devtools")
library("devtools")
install_github("JosephCrispell/basicPlotteR")
# 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")