2012-01-29 18 views
12

Rozważmy następujący wykres ggplot2 z długim tekstem aspektu/paska podzielony na dwie linie. Tekst wychodzi poza obszar poświęcony tytułom.ggplot2: Podział tekstu aspekt/pasek na dwie linie

library(ggplot2) 
x <- c(1:3, 1:3) 
y <- c(3:1, 1:3) 
grp <- c(0, 0, 0, 1, 1, 1) 
p <- qplot(x=x, y=y) + geom_line() + facet_wrap(~ grp) 
grob <- ggplotGrob(p) 
strip.elem.y <- grid.ls(getGrob(grob, "strip.text.x", 
       grep=TRUE, global=TRUE))$name 
grob <- geditGrob(grob, strip.elem.y[1], 
     label="First line and\n second line") 
grid.draw(grob) 

Czy istnieje sposób na zwiększenie wysokości obszaru tekstu paska?

+1

Możesz użyć funkcji 'str_wrap' z' stringr' wewnątrz 'transform'. Aby uzyskać szczegółowe informacje, patrz [Odpowiedź firmy Ista] (https://groups.google.com/forum/#!topic/ggplot2/0iODapyt2Pc). –

Odpowiedz

6

Próbowałem to na różne sposoby, ale był sfrustrowany coraz paste(strwrap(text, width=40), collapse=" \n") dać mi wyniki dla pojedynczego wiersza danych i nie złączyć każdy bit tekst z całej listy.

Wymyśliłem rozwiązanie, które najlepiej sprawdziło się dla mnie. Napisałem funkcję podobną do poniższej. Biorąc pod uwagę dataframe data z kolumny text

wrapit <- function(text) { 
    wtext <- paste(strwrap(text,width=40),collapse=" \n ") 
    return(wtext) 
} 

data$wrapped_text <- llply(data$text, wrapit) 
data$wrapped_text <- unlist(data$wrapped_text) 

Po Zadzwoniłem tej funkcji, po prostu zastosować moją labeller funkcję kolumny wrapped_text zamiast kolumny text.

12

Można użyć etykietę 2-LINE:

grp <- c(rep("foo\nbar",3), 1, 1, 1) 
qplot(x=x, y=y) + geom_line() + facet_wrap(~ grp) 
2

ggplot2 obsługuje wbudowany sposób wykonywania tej czynności za pomocą label_wrap_gen.

x <- c(1:3, 1:3) 
y <- c(3:1, 1:3) 
grp = c(rep("group 1 with a long name",3),rep("group 2 with a long name",3)) 
d = data.frame(x = x, y =y, grp = grp) 
ggplot(d, aes(x=x,y=y)) + geom_line() + facet_wrap(~ grp, labeller = label_wrap_gen(width=10)) 
Powiązane problemy