web-dev-qa-db-de.com

Automatisches Umwickeln von Etiketten mit labeller = label_wrap in ggplot2

Ich möchte meine Etiketten automatisch in ggplot2 einwickeln. Hier ist geschrieben, wie man eine Funktion (1) dafür schreibt, aber leider weiß ich nicht, wo ich labeller=label_wrap in meinem Code (2).

(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

Ich möchte hier einige der längeren Etiketten einpacken.

38
Til Hund

Sie brauchen die Funktion label_wrap Nicht. Verwenden Sie stattdessen die Funktion str_wrap Aus dem Paket stringr.

Sie geben Ihren df -Datenrahmen nicht an, daher erstelle ich einen einfachen Datenrahmen, der Ihre Beschriftungen enthält. Wenden Sie dann die Funktion str_wrap Auf die Beschriftungen 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

Wenden Sie nun die Beschriftungen auf ein ggplot-Diagramm an: Das erste Diagramm verwendet die ursprünglichen Beschriftungen. Das zweite Diagramm verwendet die geänderten Bezeichnungen. und für das dritte Diagramm werden die Bezeichnungen 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

118
Sandy Muspratt

Das Paket "scales" enthält eine Funktion, die der von Claude und Leonardo sehr ähnlich ist: 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))
15

Hier ist eine andere Möglichkeit ohne Verweis 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")

erledigt die Arbeit des dynamischen Aufteilens der Etiketten. Das Ergebnis ist dasselbe wie im ersten Antwort .

13
Claude

(Hoffentlich) die Antwort von @ Claude verbessern:

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