ggplot2 legend - ggplot:Wie man Facettenlabels ändert?




title center (10)

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.


Answers

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)

Hier ist eine andere Lösung, die im Sinne von @ naught101 ist, aber einfacher ist und auch keine Warnung auf die neueste Version von ggplot2 gibt.

Grundsätzlich erstellen Sie zunächst einen benannten Zeichenvektor

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

Und dann verwenden Sie es als Labeler, indem Sie einfach die letzte Zeile des von @ naught101 angegebenen Codes ändern

... + facet_grid(hospital ~ ., labeller = as_labeller(hospital_names))

Hoffe das hilft.


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

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.


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 .


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.


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"

Die Antwort von naught101 einfach erweitern - Kredit geht an ihn

plot_labeller <- function(variable,value, facetVar1='<name-of-1st-facetting-var>', var1NamesMapping=<pass-list-of-name-mappings-here>, facetVar2='', var2NamesMapping=list() )
{
  #print (variable)
  #print (value)
  if (variable==facetVar1) 
    {
      value <- as.character(value)
      return(var1NamesMapping[value])
    } 
  else if (variable==facetVar2) 
    {
      value <- as.character(value)
      return(var2NamesMapping[value])
    } 
  else 
    {
      return(as.character(value))
    }
}

Was Sie tun müssen, ist eine Liste mit Name-zu-Name-Mapping zu erstellen

clusteringDistance_names <- list(
  '100'="100",
  '200'="200",
  '300'="300",
  '400'="400",
  '600'="500"
)

und definieren Sie plot_labeller() mit neuen Standardargumenten neu:

plot_labeller <- function(variable,value, facetVar1='clusteringDistance', var1NamesMapping=clusteringDistance_names, facetVar2='', var1NamesMapping=list() )

Und dann:

ggplot() + 
  facet_grid(clusteringDistance ~ . , labeller=plot_labeller) 

Alternativ können Sie eine dedizierte Funktion für jede Etikettenänderung erstellen, die Sie haben möchten.


Ich habe eine andere Möglichkeit, dasselbe Ziel zu erreichen, ohne die zugrunde liegenden Daten zu ändern:

ggplot(transform(survey, survey = factor(survey,
        labels = c("Hosp 1", "Hosp 2", "Hosp 3", "Hosp 4"))), 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())

Was ich oben getan habe, ändert die Bezeichnungen des Faktors im ursprünglichen Datenrahmen, und das ist der einzige Unterschied im Vergleich zu Ihrem ursprünglichen Code.






r ggplot2