2013-11-27 24 views
6

Mam na myśli to pytanie (Automatic adjustment of margins in horizontal bar chart). Zadałabym to pytanie właśnie tutaj, ale wygląda na to, że nie mam na to jeszcze zgody.R barplot: zawijanie długich etykiet tekstowych?

Wyobraź sobie horyzontalny kosz (jak w połączonym pytaniu), w którym możesz mieć ekstremalne długie labirynty, jak to zawsze ma miejsce w naukach społecznych (na przykład w tekście pytania z ankiety typu: "Nie czuję się wystarczająco kompetentny, aby rozwiązać problemy w R ").

Użytkownik thelatemail podał rozwiązanie, jak przesunąć początek wykresu w zależności od długości tekstu etykiet. Działa to dobrze dla etykiet o długości, powiedzmy 10 lub 15 znaków, ale jeśli musisz oznaczyć oś Y bardzo długimi etykietami, nie możesz przesuwać początku wątku w nieskończoność.

Tak więc, jest bardziej odpowiedni do zawijania etykiet tekstowych po kilku spefific słów/znaków, na przykład, w moim przykładzie może chcesz zawinąć go tak:

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

Jednakże, I don” • wiedzieć, jak zawinąć etykiety tekstowe w R, a ponadto, jak wziąć pod uwagę opakowanie, aby automatycznie przesunąć początek fabuły. Na przykład, jeśli mam etykietę składającą się z 50 znaków i zapakuję ją w 2 wiersze po 25 znaków każda, byłoby świetnie, gdyby rozwiązanie thelatemail wzięłoby to pod uwagę.

Podziwiam każdą pomoc dotyczącą tego problemu! Dzięki!

Odpowiedz

7

Jest jedno możliwe rozwiązanie przedstawione przez Marca Schwartz w swoim stanowisku do 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) 
    } 
} 

Spróbuj:

> 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" 

lub

> 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" 

a następnie utworzyć 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

To jest dobre; dla każdego, kto idzie tu, że zastanawia się, to też działa idealnie dla zwykłego tekstu:

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