Добавить разрыв строки для меток и тиков оси в ggplot

Я ищу способ использовать длинные имена переменных на оси X графика. Конечно, я мог бы использовать меньший шрифт или немного повернуть их, но я бы хотел, чтобы они были вертикальными и читаемыми.

В качестве примера:

df <- data.frame(a=LETTERS[1:20], b=rnorm(20), c=rnorm(20), d=rnorm(20))
df_M <- melt(df, id="a")
plot <- ggplot(data=df_M, 
               aes(x=variable, y=a, fill=value)) + 
          geom_tile() + 
          scale_fill_gradient(low="green", high="red")
plot

здесь ось x - это просто буквы, но если я хочу использовать полное имя, имена используют непропорционально много места:

    plot +  
      theme(axis.text.x=element_text(angle=90)) + 
      scale_x_discrete(breaks=unique(df_M$variable), 
                       labels=c("Ambystoma mexicanum", 
                                "Daubentonia madagascariensis",
                                "Psychrolutes marcidus"))

Поэтому я хотел бы поставить разрыв строки в метках. Желательно в ggplot2, но приветствуются и другие решения.

Спасибо!

Ответ 1

Вы можете добавить свой собственный форматировщик (см. пакет scales для получения дополнительных примеров). Здесь я заменяю любое пространство в ваших ярлыках x новой строкой.

addline_format <- function(x,...){
    gsub('\\s','\n',x)
}

myplot + 
    scale_x_discrete(breaks=unique(df_M$variable), 
    labels=addline_format(c("Ambystoma mexicanum", 
                        "Daubentonia madagascariensis", "Psychrolutes marcidus")))

enter image description here

Ответ 2

через str_replace_all() замените 'foo_your_symbol_delim' пробелом ''

через str_wrap из библиотеки stringr, с предварительно заданной шириной 40, разделить пробелом ' ', обернуть фрагменты и вставить

library(stringr)
...
+ scale_x_discrete(labels = function(x) str_wrap(str_replace_all(x, "foo" , " "),
                                                 width = 40))

Ответ 3

Если вы не хотите перерыв в каждом пробеле, вы можете использовать \n (новую строку) в вызове scale_x_continuous:

my.labels <- c("Ambystoma\nmexicanum",
               "Daubentonia madagascariensis", 
               "Psychrolutes marcidus") # first create labels, add \n where appropriate.

myplot + 
    scale_x_discrete(labels= my.labels)

Обратите внимание, что только имя (Ambystoma mexicanum) будет прервано с помощью команды новой строки (\n).

Ответ 4

Я также добавил бы к ответу @SoilSciGuy, что если вы хотите изменить только одну метку, вы можете сделать это внутри scale_x_discrete().

myplot + scale_x_discrete(labels = c("Ambystoma mexicanum" = "Ambystoma\nmexicanum")