如何从向量中删除未知的空格?

3

我有一个向量,其中包含

temp <- c("hyndman_ensemble","four_theta","tbats")

当我打印temp时,four_theta和tbats之间会出现未知的空格(在R控制台中尝试此操作)。

[1] "hyndman_ensemble" "four_theta"       "tbats" 

我正在将这个临时变量用于图例中。由此导致的问题是图例会出现空格,如果列表中有5个项目,则数据会遗漏。

Legend_function:

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(...)
}

cl <- rainbow(3) 
#Null plot just to display what is happening with the spaces in legend
plot(NULL, xlim=c(0,30), ylim=c(0,100000))
add_legend("topright", legend=c("test1",temp), lty=1,
                   col=c("orange", cl),
                   horiz=TRUE, bty='n', cex=0.8)

这是图表的样子。 plot result 即使我使用trimws(),也会得到空格(见图片)。
有人能告诉我如何去掉这些空格或任何其他替代方法,以便我可以在不留空格的情况下在图表外打印图例(图例不一定要在顶部)。 using trimws

1
当您在控制台打印时,没有未知的空格。看到双引号了吗?它们告诉您文本元素的边界。没有空格。三个向量值之间的间隙不是真正的空白。这只是它选择将显示格式化为控制台的方式。所以那不是问题所在。问题出在其他地方。(您也可以执行 cat(temp) 来查看此内容) - user10917479
@Adam,当你打印temp时,你有双空格吗?因为我在另外两个设备上尝试了同样的代码行,我看到four_theta和tbats之间有空格。 - Bella_18
1
trimws(temp, whitespace = '[\\h\\v]') [1] "hyndman_ensemble" "four_theta" "tbats",正如@Adam所说。那么现在怎么办? - Chris
2
sprintf('%s', temp),[1] "hyndman_ensemble" "four_theta" "tbats",更糟糕的是 swapped <- c('tbats', 'four_theta', 'hyndman_ensamble') [1] "tbats" "four_theta" "hyndman_ensamble"。我现在只能跟进并等待更聪明的人发表意见,因为很难看出“不存在的东西”如何传播到图形。 - Chris
3
默认情况下,字符向量在控制台中的打印方法为每个元素分配相同的字符宽度。您可以通过输入c("a", "b", "c", "d"),然后输入c("aaa", "b", "c", "d"),再输入c("aaaaaaaaaa", "b", "c", "d")来查看这一点。通常情况下,这是很好的,因为当向量足够长以至于需要跨多行时,它有助于对齐。 legend函数在选择间距时也有类似的行为。但改变其中一个不会改变另一个——它们只是碰巧做了同样的事情。 - Gregor Thomas
显示剩余4条评论
3个回答

5

您可以将text.width参数设置为“NA”,默认值为NULL:

plot(NULL, xlim=c(0,30), ylim=c(0,100000))
add_legend("topright", legend=temp, lty=1,
           col=c("orange", cl),
           horiz=TRUE, bty='n', cex=0.8, xjust= 0, text.width=NA)

enter image description here

我理解你只有一个值为text.width = NULL,它对应于最长条目所需的宽度。这个值是"hyndman_ensemble"。如果将其设置为"NA",则在这种情况下会得到一个包含4个条目的向量。每个条目指定每个图例条目需要的长度。 enter image description here源代码在这里: https://stat.ethz.ch/R-manual/R-devel/library/graphics/html/legend.html

text.width = NA 出现错误。'text.width' 必须是数值,且大于等于0。 - Bella_18
我查看了图例函数的源代码,并在这里(https://github.com/wch/r-source/blob/trunk/src/library/graphics/R/legend.R#L138)显示了当text.width为NA时应该执行的操作。也许您需要更新R版本。您还可以将`graphics::legend`的输出(它打印您使用的图例函数的源代码)与每小时更新的github上的源代码进行比较。 - bioinformatics_user

3
您可以在您的add_legend函数中使用两个参数。text.width:

图例文本在x轴(“用户”)坐标轴上的宽度。(即使是反向x轴,也应该是一个单一的正数。)默认值为由strwidth(legend)计算出的正确值。

x.intersp:

用于水平(x)间距的字符间距因子。

运行您的代码时:

temp <- c("hyndman_ensemble","four_theta","tbats")

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(...)
}

cl <- rainbow(3) 
#Null plot just to display what is happening with the spaces in legend
plot(NULL, xlim=c(0,30), ylim=c(0,100000))
add_legend("topright", legend=c("test1",temp), lty=1,
           col=c("orange", cl),
           horiz=TRUE, bty='n', cex=0.8)

在Rstudio中使用Zoom输出:

enter image description here

当尝试像这样为text.widthx.intersp设置一些值时:

plot(NULL, xlim=c(0,30), ylim=c(0,100000))
add_legend("topright", legend=c("test1",temp), lty=1,
           col=c("orange", cl),
           horiz=TRUE, bty='n', cex=0.8,
           x.intersp = 0.25,
           text.width = 0.3)

以下是使用Zoom后的输出结果:

enter image description here

如您所见,现在它还显示了函数中的“test1”。您可以根据需要调整参数。

1
当然,有赏金的话,这应该是一个“可靠的来源”和答案。对于感兴趣的读者,可以提到在哪里找到x.intersptext.width的帮助。 - Chris
@Quinten。谢谢你。但是实际上我的temp中有6个值。由于空格的问题,图例被遮挡在了左边。即使我用pch=20替换lty,仍然会有一个图例的值因为空格而失踪。如果我使用temp=c("test1", "test2", "test3", "test4", "test5")而不使用x.intersp和text.width尝试相同的函数,则图例可以正常显示(所有值都可以看到)。 - Bella_18
嗨@bella_pa,你是否尝试过使用x.intersp和text.width的不同值进行试错?因为有6个值时情况就不同了。 - Quinten
@Quinten 是的,我进行了尝试和错误。 - Bella_18

0

我终于运行了您非常好的add_legend函数和plot(NULL,所有值(test1:tbats)都很好地排列在图的顶部,包括cl'd等等,所以我无法复制您的问题。plot(NULL,对我来说确实是一个“啊哈”时刻。我们经常要求使用一些可疑的函数来处理“数据”,但是plot(NULL,无需这样做,并将重点放在par属性上,因为temp是足够的数据。现在,我将尝试在下面发布该图:

plots all parameters

R.Version()$version.string
[1] "R version 4.2.1 (2022-06-23)"

所有这些可能令人失望,只需将其作为答案发布并包含一个图表图片。

然后再次使用上面建议的“五个”项目总数在图例中:

temp2 <- c('hyndman_ensamble','four_theta','tbats','test2')

plot(NULL, xlim=c(0,30), ylim=c(0,100000))
add_legend("topright", legend=c("test1",temp2), lty=1,
                   col=c("orange", cl),
                   horiz=TRUE, bty='n', cex=0.8)

five_items_legend

我朝你的方向漂移...通过在左边失去'test1'。现在要潜入par(,或者也许是legend(。使用toptopleft,所有项目都显示(尽管很小)。因此,在这种情况下,如果没有@quinten上面有用的建议更改,topright就是你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接