r - 使用“R 中情节之外的传奇”的答案,但仍然存在一些问题

Posted

技术标签:

【中文标题】r - 使用“R 中情节之外的传奇”的答案,但仍然存在一些问题【英文标题】:r - Using an answer from "Legend outside the plot in R", but it still has some problems 【发布时间】:2017-07-31 03:27:59 【问题描述】:

我正在尝试实现question 中的答案之一

我正在使用第三个答案,即具有函数 new_legend 的答案。 这是我的输出。

我无法共享数据。只需将其视为 data.frames 中的列:df1、df2、df12。

生成图像的代码如下:

    add_legend <- function(...) 
      opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), 
                  mar=c(0, 0, 0, 0), new=TRUE)
      on.exit(par(opar))
      plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
      legend(...)
    

op <- par(cex = 1)
#bc
plot(df1[,2],df2[,1],xlab="save",ylab="log85",ylim=c(6, 10))
#bc2
points(df1[,2],df2[,3],xlab="save",ylab="log85",col=2)
#od
points(df1[,2],df1[,1],pch=3,col=3)
#od2
points(df12[,2],df12[,1],pch=3)
add_legend("top", legend=c("too big text", "description with","a lot of" ,"useless freespace"),
           col=c(1, 2,3,1),pch=c(1,1,3,3),horiz=TRUE, bty='n', x.intersp = 0.3)

我想将图例放在描述之间的可用空间较小且字体较大的位置。我试过使用x.intersp,但它只是减少了符号与其描述之间的距离,而不是前一个描述和下一个符号之间的距离。如果我在绘图前使用par(cex=1),则字体大小很好,但会剪切更多文本。

任何帮助将不胜感激。

【问题讨论】:

@d.b 我已经添加了代码。不过,我无法分享数据。任何帮助,将不胜感激。 ;) 【参考方案1】:

在当前的 R 版本 (3.5.0) 中不能这样做。

如果您指定horiz=TRUE 或 nc>1,则每个图例条目之间的水平距离将始终相等,并且每个条目之间的间距将由最长的条目决定。如果项目的数量跨越多列和多行,这在美学上很重要,但当您的示例中看到有多列且只有一行时,这并不重要。正如您巧妙地暗示的那样,如果项目的长度不相等,结果可能会变得相当丑陋并且似乎浪费空间。不幸的是,似乎没有参数可以手动控制每个项目之间的距离。所以你已经遇到了 R 的限制之一。一种解决方法是自己破解图例函数并找到代码的哪一部分放置图例条目。我曾经破解过它,让你可以调整填充框相对于图例其他部分的大小。我注意到随着每个新的主要 R 升级,legend 函数的参数数量一直在增长,例如,seg.len 参数是最近添加的,可以调整行长。也许在未来的版本中,将有一个新参数允许您手动指定图例条目之间的水平间距(并调整填充框的大小)。 :)

也许你最好的选择是指定nc=2而不是horiz=TRUE

编辑:如果每个图例条目之间的空间太大,text.width 参数也可能会有所帮助,但同样,每个条目之间的距离必须相等。

【讨论】:

以上是关于r - 使用“R 中情节之外的传奇”的答案,但仍然存在一些问题的主要内容,如果未能解决你的问题,请参考以下文章

在R Markdown编织输出中显示javascript结果

在 R 中创建带有工具提示的 pdf

可以在 R 中读取 PMML 模型吗?

片段布局加载延迟

R中具有多个分组因子的多个变量的均值和标准差

隐藏 Ipad 的键盘,但仍然可以通过自定义键盘进入输入字段