2013-11-27 7 views
6

Я имею в виду этот вопрос (Automatic adjustment of margins in horizontal bar chart). Я бы задал свой вопрос прямо там, но, похоже, у меня пока нет разрешения.R barplot: упаковка длинных текстовых меток?

Представьте себе горизонтальный штрих-план (как в связанном вопросе), где у вас могут быть крайние длинные листы, как у нас всегда есть в социальных науках (например, формулировка вопроса в виде опроса типа «Я не чувствую себя достаточно компетентным, чтобы решить проблемы в R ").

Пользователь thelatemail дал решение, как перенести начало сюжета в зависимости от длины текста меток. Это работает нормально для ярлыков длиной, например, 10 или 15 символов, но если вам нужно пометить свою ось Y очень длинными надписями, вы не можете перенести начало графика бесконечно.

Таким образом, более уместно, чтобы обернуть текстовые метки после spefific количество слов/символов, например, в моем примере вы можете обернуть его так:

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

Однако, я не» t умеют обертывать текстовые метки в R и, кроме того, как учитывать обертывание для автоматического перемещения начала сюжета. Например, если у меня есть метка из 50 символов, и я обертываю ее в две строки по 25 символов каждый, тогда было бы здорово, если бы решение thelatemail учло бы это.

Приносим извинения за эту проблему! Спасибо!

ответ

7

Существует один из возможных решений, представленный Марк Шварц в своем посте на 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" 

, а затем создать barplot:

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

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

Смежные вопросы