R barplot:包装长文本标签?

时间:2013-11-27 11:20:11

标签: r plot bar-chart labels textwrapping

我指的是这个问题(Automatic adjustment of margins in horizontal bar chart)。我会在那里问我的问题,但似乎,我还没有这样做的许可。

想象一下水平的条形图(就像在链接的问题中一样),你可能会像我们在社会科学中一样拥有极长的标签(例如,调查项目的问题措辞,例如“我觉得不足以解决问题在R“)。

用户 thelatemail 提供了一个解决方案,如何根据标签的文本长度移动绘图的开头。这适用于长度为10或15个字符的标签,但如果必须用非常长的标签标记y轴,则无法无限地移动绘图的开头。

因此,在特定数量的单词/字符之后包装文本标签更合适,例如,在我的示例中,您可能希望将其包装为:

"I don't feel competent enough
to solve problems in R"

但是,我不知道如何在R中包装文本标签以及如何将包装考虑在内以自动移动绘图的开头。例如,如果我有一个50个字符的标签,并且我将它包装成2行,每行25个字符,那么如果 thelatemail 的解决方案将考虑到这一点,那就太棒了。

我对这个问题提出了任何帮助! 谢谢!

2 个答案:

答案 0 :(得分:10)

Marc Schwartz在R-help的帖子中提出了一种可能的解决方案:

a <- c("I don't feel competent enough to solve problems in R", "I don't feel competent enough to solve problems in R")

# Core wrapping function
wrap.it <- function(x, len)
{ 
  sapply(x, function(y) paste(strwrap(y, len), 
                              collapse = "\n"), 
         USE.NAMES = FALSE)
}


# Call this function with a list or vector
wrap.labels <- function(x, len)
{
  if (is.list(x))
  {
    lapply(x, wrap.it, len)
  } else {
    wrap.it(x, len)
  }
}

试一试:

> wrap.labels(a, 10)
[1] "I don't\nfeel\ncompetent\nenough to\nsolve\nproblems\nin R"
[2] "I don't\nfeel\ncompetent\nenough to\nsolve\nproblems\nin R"

> wrap.labels(a, 25)
[1] "I don't feel competent\nenough to solve problems\nin R"
[2] "I don't feel competent\nenough to solve problems\nin R"

然后创建一个条形图:

wr.lap <- wrap.labels(a, 10)
barplot(1:2, names.arg = wr.lap, horiz = T, las = 2, cex.names = 0.5)

enter image description here

答案 1 :(得分:0)

这很棒;对于那些想要来到这里的人来说,它也适用于普通文本:

plot(1:10, 1:10)
txt <- "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
text(8, 3.5, wrap.labels(txt, 10), cex=0.8, pos=4)

enter image description here