Автоматическая упаковка меток с помощью labeller = label_wrap в ggplot2

Я хотел бы автоматически обернуть мои метки в ggplot2. Здесь написано, как написать для него функцию (1), но, к сожалению, я не знаю, куда положить labeller=label_wrap в мой код (2).

(1) функция byley

label_wrap <- function(variable, value) {
  lapply(strwrap(as.character(value), width=25, simplify=FALSE), 
         paste, collapse="\n")
}

(2) пример кода

df = data.frame(x = c("label", "long label", "very, very long label"), 
                y = c(10, 15, 20))

ggplot(df, aes(x, y)) + geom_bar(stat="identity")

Гистограмма с длинной меткой не завернута

Я хотел бы обернуть некоторые из более длинных меток здесь.

Ответ 1

Вам не нужна функция label_wrap. Вместо этого используйте str_wrap функцию из пакета stringr.

Вы не предоставляете свой кадр данных df, поэтому я создаю простой фрейм данных, который содержит ваши метки. Затем примените функцию str_wrap к меткам.

library(ggplot2)
library(stringr)

df = data.frame(x = c("label", "long label", "very, very long label"), 
                y = c(10, 15, 20))
df

df$newx = str_wrap(df$x, width = 10)
df

Теперь применить метки к диаграмме ggplot: первый график использует оригинальные метки; второй график использует измененные метки; и для третьего графика метки изменяются при вызове ggplot.

ggplot(df, aes(x, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity") 

ggplot(df, aes(newx, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity")

ggplot(df, aes(x, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

enter image description here

Ответ 2

Вот еще один способ без ссылки на библиотеку stringr:

ggplot(df, aes(x, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity") +
  scale_x_discrete(labels = function(x) lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n"))

где вызов:

lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n")

работает динамическое разбиение меток. Результат будет таким же, как в первом ответе .

Ответ 3

Пакет "весы" включает функцию, очень похожую на Клода и Леонардо: wrap_format.

library(scales)
ggplot(df, aes(x, y)) + geom_bar(stat = "identity") + 
    labs(x = "", y = "Number of Participants") + 
    scale_x_discrete(labels = wrap_format(10))

Ответ 4

(Надеюсь), улучшив ответ на @Claude:

get_wraper <- function(width) {
    function(x) {
        lapply(strwrap(x, width = width, simplify = FALSE), paste, collapse="\n")
    }
}

ggplot(df, aes(x, y)) + geom_bar(stat = "identity") + 
    labs(x = "", y = "Number of Participants") + 
    scale_x_discrete(labels = get_wraper(10))