Оберните метки длинной оси через labeller = label_wrap в ggplot2

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

(1) функция Хэдли

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

«Гистограмма

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


person Til Hund    schedule 19.02.2014    source источник
comment
почему бы вам не применить функцию strwrap к своим ярлыкам за пределами ggplot2?   -  person baptiste    schedule 19.02.2014
comment
Я новичок в R. Как я могу применить функцию strwrap снаружи?   -  person Til Hund    schedule 19.02.2014
comment
Пожалуйста, включите воспроизводимый пример.   -  person Max Ghenis    schedule 12.08.2016


Ответы (4)


Вам не нужна функция 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))

введите описание изображения здесь

person Sandy Muspratt    schedule 19.02.2014
comment
Это решение очень близко к моей проблеме. Но что, если на каждом трех графике есть разные метки? Нужно ли мне определять три разные функции (x), чтобы использовать str_wrap? - person Til Hund; 20.02.2014
comment
Извините, я не понимаю вашего вопроса. Второй вызов ggplot - правильный путь. То есть применить str_wrap вне вызова ggplot. Если у вас есть другие переменные, содержащие длинные метки, примените также str_wrap к этим переменным. - person Sandy Muspratt; 20.02.2014
comment
Я думаю, что мы почти закончили, но я не совсем понимаю, как реализовать str_wrap для всех моих переменных, отсюда и графики (около 25), которые имеют все разные метки (снова см. Пример кода выше). - person Til Hund; 21.02.2014
comment
Это отличный @SandyMuspratt. Примечание: определите свой фрейм данных с variable и value вместо x и y, и станет очевидным, что синтаксис scale_x_discrete(labels = function(x) str_wrap(x, width = 10)), с использованием x, а не variable, как я ошибочно предположил при первой попытке. - person PatrickT; 14.12.2014
comment
Кроме того, вы можете добавить + theme(axis.text.x = element_text(hjust=0)), чтобы выровнять метки по левому краю (в вашем примере 3 линии выглядят по центру). - person PatrickT; 14.12.2014
comment
Большая проблема в том, что str_wrap превращает множители в символы, поэтому порядок уровней множителя теряется. - person Dan Chaltiel; 20.11.2017

Пакет "scale" включает функцию, очень похожую на функцию Клода и Леонардо: 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))
person Nicolás Velásquez    schedule 03.08.2017
comment
Преимущество этого решения по сравнению с решением Сэнди состоит в том, что оно сохраняет порядок факторов. - person AndrewMinCH; 15.10.2019

Вот еще один способ без ссылки на библиотеку 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")

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

person Claude    schedule 05.08.2016

(Надеюсь) улучшение ответа @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))
person Leonardo Fontenelle    schedule 04.10.2016
comment
@Leonardo_Fontenelle достаточно одной функции function(x,width) - person timat; 24.11.2016