2014-02-19 6 views
27

Ich möchte meine Etiketten automatisch in ggplot2 verpacken. Here ist geschrieben, wie man eine Funktion (1) dafür schreibt, aber leider weiß ich nicht, wohin labeller=label_wrap in meinem Code (2) zu setzen ist.Automatisches Einpacken von Etiketten über etikettierer = label_wrap in ggplot2

(1) Funktion von hadley

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

(2) Codebeispiel

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

Histogram with long label not wrapped

würde Ich mag hier einige der mehr Etiketten wickeln.

+0

Warum wenden Sie die strwrap-Funktion nicht außerhalb von ggplot2 auf Ihre Etiketten an? – baptiste

+0

Ich bin neu in R. Wie könnte ich die strawrap-Funktion außerhalb anwenden? –

+0

Bitte fügen Sie ein reproduzierbares Beispiel bei. –

Antwort

70

Sie benötigen die label_wrap Funktion nicht. Verwenden Sie stattdessen die str_wrap-Funktion aus dem stringr-Paket.

Sie geben Ihren Datenrahmen nicht an, deshalb erstelle ich einen einfachen Datenrahmen, einen, der Ihre Etiketten enthält. Wenden Sie dann die str_wrap Funktion auf den Etiketten an.

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 

Jetzt die Beschriftungen auf ein ggplot-Diagramm anwenden: Das erste Diagramm verwendet die ursprünglichen Beschriftungen; das zweite Diagramm verwendet die modifizierten Bezeichnungen; und für das dritte Diagramm werden die Beschriftungen im Aufruf von ggplot geändert.

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

+0

Diese Lösung scheint meinem Problem sehr nahe zu sein. Aber was, wenn jeder drei Graph verschiedene Beschriftungen hat? Muss ich drei verschiedene Funktionen (x) definieren, um str_wrap zu verwenden? –

+0

Es tut mir leid, ich verstehe dich nicht Frage. Der zweite Aufruf von ggplot ist der richtige Weg. Das bedeutet, dass Sie str_wrap außerhalb des Aufrufs von ggplot anwenden. Wenn Sie andere Variablen mit langen Beschriftungen haben, wenden Sie auch str_wrap auf diese Variablen an. –

+0

Ich denke, wir sind fast da, aber ich verstehe nicht ganz, wie man die str_wrap für alle meine Variablen implementiert, daher Graphen (etwa 25), die alle unterschiedliche Bezeichnungen haben (siehe auch obigen Beispielcode). –

8

ist hier eine andere Art und Weise ohne Bezug auf die Bibliothek 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")) 

, wo der Anruf:

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

macht die Arbeit dynamisch die Etiketten zu splitten. Das Ergebnis ist das gleiche wie in der ersten answer.

1

(hoffentlich) die Verbesserung auf @ Claude Antwort:

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)) 
+2

@Leonardo_Fontenelle nur eine Funktion ist genug Funktion (x, Breite) ' – timat

5

Die "Waage" -Paket enthält eine Funktion sehr ähnlich wie Claude und Leonardos: 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)) 
Verwandte Themen