Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的智能点标签放置_R_Plot_Label - Fatal编程技术网

R中的智能点标签放置

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

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

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")
对于标签,我尝试了这些可能性,没有人是真正好的:

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)非常有趣。但对我来说,点标记情况大致可分为三类:

  • 你有一小部分的观点,没有一点是非常接近的。在这种情况下,您在问题中列出的解决方案之一很可能只需进行非常小的调整即可工作
  • 你有一小部分的点,其中一些点过于密集,对于典型的算法解决方案来说,无法给出好的结果。在这种情况下,由于您只有少量的点,因此手动标记它们(使用图像编辑器或微调对
    文本的调用
    )并没有那么大的工作量
  • 你有相当多的分数。在这种情况下,无论如何都不应该给它们贴标签,因为很难直观地处理大量标签
  • :爬上肥皂盒:

    因为像我们这样的人喜欢自动化,我认为我们经常陷入这样的陷阱,认为制作一个好的统计图表的几乎每个方面都应该自动化。我恭敬地(谦恭地!)不同意

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

    :从肥皂盒向下爬:


    我还要指出的是,我认为我们都可以得出散点图,我找到了一些解决方案!不幸的是,这并不是终极的、理想的,但它现在对我来说是最有效的。它是半算法的,半人工的,所以与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)
    

    df
    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)
    
    #数据
    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")