ggplot: Wie man Facettenlabels ändert?




ggplot2 (8)

Ändern Sie die Namen der zugrundeliegenden Faktorstufen wie folgt:

# Using the Iris data
> i <- iris
> levels(i$Species)
[1] "setosa"     "versicolor" "virginica" 
> levels(i$Species) <- c("S", "Ve", "Vi")
> ggplot(i, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)

Ich habe den folgenden Befehl ggplot verwendet:

ggplot(survey,aes(x=age))+stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
  +scale_y_continuous(formatter = "percent", breaks=c(0, 0.1, 0.2)) 
  + facet_grid(hospital ~ .) 
  + opts(panel.background = theme_blank()) 

produzieren

Ich möchte die Facettenetiketten jedoch auf etwas kürzeres ändern (wie Hosp 1, Hosp 2 ...), weil sie jetzt zu lang sind und eng aussehen (eine Erhöhung der Höhe des Graphen ist keine Option, würde es erfordern) zu viel Platz im Dokument). Ich habe die facet_grid , kann aber nicht herausfinden, wie.


Beachten Sie, dass diese Lösung nicht gut funktioniert, wenn ggplot weniger Faktoren anzeigt, als Ihre Variable tatsächlich enthält (was passieren könnte, wenn Sie beispielsweise eine Teilmenge gebildet hätten):

 library(ggplot2)
 labeli <- function(variable, value){
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
 }

 dat <- subset(iris,Species!="setosa")
 ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli)

Eine einfache Lösung (neben dem Hinzufügen aller ungenutzten Faktoren in names_li, was mühsam sein kann) ist, die nicht verwendeten Faktoren mit droplevels () entweder im ursprünglichen Dataset oder in der Labbeler-Funktion zu löschen, siehe:

labeli2 <- function(variable, value){
  value <- droplevels(value)
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
}

dat <- subset(iris,Species!="setosa")
ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli2)

Haben Sie versucht, die spezifischen Werte Ihres Hospital ändern?

levels(survey$hospital)[levels(survey$hospital) == "Hospital #1"] <- "Hosp 1"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #2"] <- "Hosp 2"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #3"] <- "Hosp 3"

Hier ist eine Lösung, die das Bearbeiten Ihrer Daten vermeidet:

Angenommen, Ihr Plot wird durch den group Ihres Datenrahmens facettiert, der die Ebenen control, test1, test2 , und dann eine Liste mit diesen Werten erstellen:

hospital_names <- list(
  'Hospital#1'="Some Hospital",
  'Hospital#2'="Another Hospital",
  'Hospital#3'="Hospital Number 3",
  'Hospital#4'="The Other Hospital"
)

Dann erstellen Sie eine "Labeler" -Funktion und schieben Sie sie in Ihren facet_grid-Aufruf:

hospital_labeller <- function(variable,value){
  return(hospital_names[value])
}

ggplot(survey,aes(x=age)) + stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
 + facet_grid(hospital ~ ., labeller=hospital_labeller)
 ...

Dies verwendet die Ebenen des Datenrahmens zum Indexieren der Liste "hospital_names" und gibt die Listenwerte (die korrekten Namen) zurück.

Bitte beachten Sie, dass dies nur funktioniert, wenn Sie nur eine Facettierungsvariable haben. Wenn Sie zwei Facetten haben, muss Ihre Beschriftungsfunktion für jede Facette einen anderen Namensvektor zurückgeben. Sie können dies mit etwas tun wie:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else {
    return(facet2_names[value])
  }
}

Dabei sind facet1_names und facet2_names vordefinierte Listen von Namen, die durch die Facettenindexnamen ('Hostpital # 1' usw.) indiziert werden.

Bearbeiten: Die obige Methode schlägt fehl, wenn Sie eine Variablen / Wert-Kombination übergeben, die der Etikettierer nicht kennt. Sie können einen Fail-Safe für unbekannte Variablen wie folgt hinzufügen:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else if (variable=='facet2') {
    return(facet2_names[value])
  } else {
    return(as.character(value))
  }
}

Antwort angepasst von, wie strip.text Beschriftungen in Ggplot mit Facette und Rand geändert werden = TRUE

Bearbeiten: WARNUNG : Wenn Sie diese Methode verwenden, um durch eine Zeichenspalte zu facettieren, erhalten Sie möglicherweise falsche Beschriftungen. Siehe diesen Fehlerbericht . behoben in den letzten Versionen von ggplot2.


Hier ist, wie ich es mit facet_grid(yfacet~xfacet) mit ggplot2, Version 2.2.1 gemacht habe:

facet_grid(
    yfacet~xfacet,
    labeller = labeller(
        yfacet = c(`0` = "an y label", `1` = "another y label"),
        xfacet = c(`10` = "an x label", `20` = "another x label")
    )
)

Beachten Sie, dass dies keinen Aufruf von as_labeller() - etwas, mit dem ich eine Weile zu kämpfen hatte.

Dieser Ansatz basiert auf dem letzten Beispiel auf der Hilfeseite Coerce to labeller function .


Ich denke, alle anderen Lösungen sind wirklich hilfreich, aber es gibt noch einen anderen Weg.

Ich nehme an:

  • Sie haben das Paket dplyr installiert, das den Befehl dplyr hat, und
  • Ihr Datensatz wird als survey .

    Umfrage%>% mutieren (Hosp1 = Hospital1, Hosp2 = Hospital2, ........)

Mit diesem Befehl können Sie Spalten umbenennen, aber alle anderen Spalten bleiben erhalten.

Dann mache die selbe facet_wrap , es geht dir gut.


Wenn Sie zwei Facetten hospital und room aber nur eines umbenennen möchten, können Sie Folgendes verwenden:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names)))

Um zwei Facetten mithilfe des vektorbasierten Ansatzes umzubenennen (wie in der Antwort von naught101), können Sie Folgendes tun:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names),
                                                 room = as_labeller(room_names)))

facet_wrap und facet_grid akzeptieren auch Eingaben von ifelse als Argument. Wenn also die für die Facettierung verwendete Variable logisch ist, ist die Lösung sehr einfach:

facet_wrap(~ifelse(variable, "Label if true", "Label if false"))

Wenn die Variable mehr Kategorien aufweist, muss die ifelse Anweisung nested .

Als Nebeneffekt erlaubt dies auch die Erstellung der Gruppen, die innerhalb des ggplot Aufrufs facettiert werden.





ggplot2