Ich versuche, ein Balkendiagramm zu erstellen, bei dem der größte Balken der y-Achse am nächsten und der kürzeste Balken am weitesten entfernt ist. Das ist also ein bisschen wie der Tisch, den ich habe
Name Position
1 James Goalkeeper
2 Frank Goalkeeper
3 Jean Defense
4 Steve Defense
5 John Defense
6 Tim Striker
Ich versuche also, ein Balkendiagramm zu erstellen, das die Anzahl der Spieler nach Position anzeigt
p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)
Die Grafik zeigt jedoch zuerst die Torwartleiste, dann die Verteidigung und schließlich die Stürmerleiste. Ich möchte, dass die Grafik so angeordnet wird, dass der Verteidigungsbalken der y-Achse am nächsten liegt, der Torhüter und schließlich der Stürmer. Vielen Dank
ggplot2
, nicht an den OPAntworten:
Der Schlüssel bei der Bestellung besteht darin, die Ebenen des Faktors in der gewünschten Reihenfolge festzulegen. Ein geordneter Faktor ist nicht erforderlich. Die zusätzlichen Informationen in einem geordneten Faktor sind nicht erforderlich. Wenn diese Daten in einem statistischen Modell verwendet werden, kann dies zu einer falschen Parametrisierung führen. Polynomkontraste sind für nominelle Daten wie diese nicht geeignet.
Im allgemeinsten Sinne müssen wir einfach die Faktorstufen so einstellen, dass sie in der gewünschten Reihenfolge liegen. Wenn nicht angegeben, werden die Ebenen eines Faktors alphabetisch sortiert. Sie können auch die Ebenenreihenfolge innerhalb des Aufrufs zum Faktor wie oben angeben. Andere Möglichkeiten sind ebenfalls möglich.
quelle
within
, ist keine Verwendung erforderlichtheTable$Position
, und Sie können dies nur tun,sort(-table(...))
um die Reihenfolge zu verringern.-
Falldecreasing = TRUE
frage ich lieber explizit nach der umgekehrten Sortierung als nach der von Ihnen verwendeten, da es weitaus einfacher ist, die Absicht zu ermitteln, als die-
im gesamten Rest des Codes zu bemerken .levels(theTable$Position) <- c(...)
führt zu unerwünschtem Verhalten, bei dem die tatsächlichen Einträge des Datenrahmens neu angeordnet werden und nicht nur die Ebenen des Faktors. Siehe diese Frage . Vielleicht sollten Sie diese Zeilen ändern oder entfernen?levels<-
. Ich werde diesen Teil zumindest vorläufig herausarbeiten.levels<-()
. Dies ist etwas von vor 8 Jahren und ich kann mich nicht erinnern, ob die Dinge damals anders waren oder ob ich einfach falsch lag, aber trotzdem ist es falsch und sollte gelöscht werden! Vielen Dank!@ GavinSimpson:
reorder
ist eine leistungsstarke und effektive Lösung dafür:quelle
ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()
Verwenden Sie
scale_x_discrete (limits = ...)
, um die Reihenfolge der Balken festzulegen.quelle
Ich denke, die bereits bereitgestellten Lösungen sind zu ausführlich. Eine präzisere Möglichkeit, ein frequenzsortiertes Barplot mit ggplot zu erstellen, ist
Es ähnelt dem, was Alex Brown vorgeschlagen hat, ist jedoch etwas kürzer und funktioniert ohne eine beliebige Funktionsdefinition.
Aktualisieren
Ich denke, meine alte Lösung war zu der Zeit gut, aber heutzutage würde ich lieber
forcats::fct_infreq
die Sortierung der Faktorstufen nach Häufigkeit verwenden:quelle
Wie
reorder()
in Alex Browns Antwort könnten wir auch verwendenforcats::fct_reorder()
. Grundsätzlich werden die im 1. Argument angegebenen Faktoren nach den Werten im 2. Argument sortiert, nachdem eine bestimmte Funktion angewendet wurde (Standard = Median, was wir hier verwenden, da nur ein Wert pro Faktorstufe vorhanden ist).Es ist eine Schande, dass in der OP-Frage die erforderliche Reihenfolge auch alphabetisch ist, da dies die Standardsortierreihenfolge ist, wenn Sie Faktoren erstellen. Dadurch wird verborgen, was diese Funktion tatsächlich tut. Um es klarer zu machen, werde ich "Torhüter" durch "Zoalhüter" ersetzen.
quelle
Eine einfache dplyr-basierte Neuordnung von Faktoren kann dieses Problem lösen:
quelle
Sie müssen nur die
Position
Spalte angeben , die ein geordneter Faktor sein soll , bei dem die Ebenen nach ihrer Anzahl geordnet sind:(Beachten Sie, dass das
table(Position)
eine Frequenzzählung der erzeugtPosition
Spalte erzeugt.)Dann zeigt Ihre
ggplot
Funktion die Balken in absteigender Reihenfolge der Anzahl an. Ich weiß nicht, ob es eine Option gibt,geom_bar
ohne explizit einen geordneten Faktor erstellen zu müssen.quelle
reorder()
die Statistikbibliothek dieselbe Aufgabe erfüllt.reorder()
in diesem Fall vor? Der Faktor, der eine Neuordnung erfordert, muss durch eine Funktion von sich selbst neu angeordnet werden, und ich habe Mühe, einen guten Weg zu finden, dies zu tun.with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x))))
ist ein Weg und ein anderer,with(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x))))
aber diese sind genauso verwickelt ...sort
anstattorder
reorder
geschickt ist. Ich stimme dieser Frage zu, dass etwas mehr involviert ist. Entschuldigung für die Verwirrung.Zusätzlich zu forcats :: fct_infreq, das von @HolgerBrandl erwähnt wird, gibt es forcats :: fct_rev, das die Faktorreihenfolge umkehrt.
quelle
Ich stimme zach zu, dass das Zählen innerhalb von dplyr die beste Lösung ist. Ich habe festgestellt, dass dies die kürzeste Version ist:
Dies ist auch erheblich schneller als die vorherige Neuordnung der Faktorstufen, da die Zählung in dplyr und nicht in ggplot oder using erfolgt
table
.quelle
Wenn die Diagrammspalten von einer numerischen Variablen wie im folgenden Datenrahmen stammen, können Sie eine einfachere Lösung verwenden:
Das Minuszeichen vor der Sortiervariablen (-Qty) steuert die Sortierrichtung (aufsteigend / absteigend)
Hier sind einige Daten zum Testen:
Als ich diesen Thread gefunden habe, war das die Antwort, nach der ich gesucht habe. Hoffe, es ist nützlich für andere.
quelle
Eine andere Alternative, bei der die Pegel eines Faktors nachbestellt werden. In aufsteigender (n) oder absteigender Reihenfolge (-n) basierend auf der Anzahl. Sehr ähnlich zu dem
fct_reorder
aus demforcats
Paket:Absteigende Reihenfolge
Aufsteigende Reihenfolge
Datenrahmen:
quelle
Da wir nur die Verteilung einer einzelnen Variablen ("Position") betrachten, anstatt die Beziehung zwischen zwei Variablen zu betrachten , wäre möglicherweise ein Histogramm das geeignetere Diagramm. ggplot hat geom_histogram () , das es einfach macht:
Verwenden von geom_histogram ():
Ich denke, geom_histogram ( ) ist etwas eigenartig, da es kontinuierliche und diskrete Daten unterschiedlich behandelt.
Für kontinuierliche Daten können Sie einfach geom_histogram () ohne Parameter verwenden. Zum Beispiel, wenn wir einen numerischen Vektor "Score" hinzufügen ...
und benutze geom_histogram () für die Variable "Score" ...
Für diskrete Daten wie "Position" müssen wir eine berechnete Statistik angeben, die von der Ästhetik berechnet wird, um den y-Wert für die Höhe der Balken zu erhalten, indem wir
stat = "count"
:Hinweis: Seltsamerweise und verwirrend können Sie es auch
stat = "count"
für kontinuierliche Daten verwenden, und ich denke, es bietet ein ästhetisch ansprechenderes Diagramm.Änderungen : Erweiterte Antwort als Antwort auf die hilfreichen Vorschläge von DebanjanB .
quelle
Ich fand es sehr ärgerlich, dass
ggplot2
dies keine "automatische" Lösung bietet. Deshalb habe ich diebar_chart()
Funktion in erstelltggcharts
.Standardmäßig werden
bar_chart()
die Balken sortiert und ein horizontales Diagramm angezeigt. Um diesen Satz zu ändernhorizontal = FALSE
. Darüber hinausbar_chart()
entfernt die unansehnliche ‚Lücke‘ zwischen den Stäben und der Achse.quelle