ggplot2: разделение текста фасета / полосы на две строки - PullRequest
13 голосов
/ 29 января 2012

Рассмотрим следующий график ggplot2 с длинным текстом фасетки / полосы разбит на две строки. Текст выходит за пределы области, посвященной заголовкам фасетов.

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)

Есть ли способ увеличить высоту текстовой области полосы?

Ответы [ 3 ]

15 голосов
/ 29 января 2012

Вы можете использовать двухстрочную метку:

grp <- c(rep("foo\nbar",3), 1, 1, 1)
qplot(x=x, y=y) + geom_line() + facet_wrap(~ grp)
13 голосов
/ 31 августа 2017

ggplot2 поддерживает встроенный способ сделать это, используя 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))
6 голосов
/ 09 декабря 2012

Я пробовал это разными способами, но был разочарован, получив paste(strwrap(text, width=40), collapse=" \n"), чтобы дать мне результаты для одной строки данных и не объединять каждый бит текста из всего списка.

Я нашел решение, которое лучше всего подействовало на меня. Я написал функцию, подобную приведенной ниже. Дан фрейм данных data со столбцом 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)

После того как я вызвал эту функцию, я просто применил свою функцию labeller к столбцу wrapped_text вместо столбца text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...