Balkendiagramme vergleichen Kategorien
Ein Balkendiagramm beantwortet "Wie viel von jedem?" - ein Balken pro Kategorie, wobei die Balkenlänge den Wert der Kategorie zeigt. In R heißt die Basisfunktion barplot(), und ihre Eingabe ist schlicht ein Vektor von Höhen. Gib dem Vektor Namen, und die Namen werden zu den Beschriftungen unter den Balken:
visits <- c(Mon = 42, Tue = 51, Wed = 47, Thu = 60, Fri = 78)
barplot(visits,
main = "Store visits by day",
ylab = "Visits")
Fünf graue Balken, nach Tagen beschriftet, ansteigend von einem bescheidenen Montag zu einem Freitagsgipfel, der fast doppelt so hoch ist. Nichts zu installieren, nichts zu konfigurieren - wenn du einen benannten Vektor bauen kannst, kannst du ihn zeichnen.
Die ausführbaren Editoren auf dieser Seite zeigen nur Textausgabe, deshalb sind die barplot()-Aufrufe hier statische Ausschnitte zum Einfügen in eine lokale R-Sitzung - aber der Zählschritt davor läuft problemlos, und das ist der Schritt, der am meisten zählt.
Der echte Ablauf: erst table(), dann barplot()
In der Praxis hast du selten hübsche vorgezählte Höhen. Du hast eine rohe Spalte mit Kategoriebezeichnungen - eine Zeile pro Umfrageantwort, pro Bestellung, pro Nutzer - und das Zählen ist die eigentliche Arbeit. table() erledigt das in einem Aufruf, und seine Ausgabe ist ein benannter Vektor von Anzahlen, also genau das, was barplot() will:
Dann ist das Diagramm eine weitere Zeile:
barplot(sort(t, decreasing = TRUE),
main = "Survey responses",
ylab = "Count")
Dieser Zweischritt - table(), dann barplot() - ist der mit Abstand häufigste Balkendiagramm-Ablauf in R. Die Tabelle vorher zu sortieren ist ein günstiges Upgrade: Nach Höhe geordnete Balken liest man schneller als alphabetisch geordnete, es sei denn, die Kategorien haben eine natürliche Ordnung (Tage, Monate, Dosisstufen) - dann hält ein Faktor mit korrekt geordneten Levels table() davon ab, sie zu alphabetisieren. Für Balken, die echte Aggregation brauchen - Summen oder Mittelwerte je Gruppe statt Zeilenzählungen -, erledige zuerst den group-by-summarize-Schritt und übergib barplot() das Ergebnis.
Beschriftungen und Stil
Die Beschriftungen kommen normalerweise aus den Namen des Vektors, aber names.arg überschreibt sie - nützlich, wenn die Codes der Daten nicht publikumstauglich sind:
barplot(visits,
names.arg = c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday"),
col = "steelblue",
border = NA,
main = "Store visits by day",
las = 2)
colfüllt die Balken; übergib einen Vektor, um jeden Balken einzeln zu färben, aber widersteh dem Regenbogen als Voreinstellung - Farbe sollte etwas bedeuten, etwa den einen Balken markieren, über den du sprichst.border = NAentfernt die Balkenumrisse für einen saubereren Look.las = 2dreht die Achsenbeschriftungen senkrecht zur Achse - die Lösung, wenn lange Kategorienamen einander überlappen. Kombinier es mit einem größeren unteren Rand (par(mar = c(8, 4, 4, 2))), wenn die Namen wirklich lang sind.
Gruppierte und gestapelte Balken aus einer Matrix
Um zwei kategoriale Dimensionen gleichzeitig zu zeigen - etwa Umsatz pro Kanal pro Quartal -, übergib barplot() eine Matrix. Jede Spalte wird zu einer Position auf der Kategorienachse, und die Zeilen werden zu den Teilbalken:
sales <- matrix(c(12, 18, 15, 22, 20, 19, 24, 27),
nrow = 2,
dimnames = list(c("Online", "Retail"),
c("Q1", "Q2", "Q3", "Q4")))
# Grouped: rows stand next to each other within each quarter
barplot(sales, beside = TRUE,
col = c("steelblue", "orange"),
legend.text = rownames(sales),
main = "Sales by channel and quarter")
# Stacked: rows pile up into one total bar per quarter (the default)
barplot(sales, beside = FALSE,
col = c("steelblue", "orange"),
legend.text = rownames(sales))
beside = TRUE stellt die beiden Kanäle innerhalb jedes Quartals Schulter an Schulter - am besten, wenn du die Kanäle direkt vergleichen willst. Die gestapelte Voreinstellung betont die Summe je Quartal, mit der Aufteilung innerhalb jedes Balkens; sie ist für Summen ehrlich, macht die inneren Segmente über Balken hinweg aber schwer vergleichbar, da sich ihre Grundlinien verschieben. legend.text = rownames(sales) ergänzt die Legende, die beide Varianten lesbar macht.
Noch ein Schalter: horiz = TRUE legt die Balken entlang der horizontalen Achse. Das ist das freundlichste Layout für viele Kategorien mit langen Namen - jede Beschriftung sitzt in ihrer eigenen Zeile neben ihrem Balken, ganz ohne Drehung.
Balkendiagramm oder Histogramm?
Suchende verwechseln die beiden ständig, und die Unterscheidung ist dreißig Sekunden wert: Ein Balkendiagramm vergleicht verschiedene Kategorien - die Achse ist eine Menge von Beschriftungen, die Balken stehen getrennt, und sie umzusortieren ist zulässig. Ein Histogramm klassiert eine numerische Variable - die Achse ist eine kontinuierliche Skala, die Balken berühren sich, weil die Klassen aufeinanderfolgende Intervalle sind, und sie umzusortieren wäre Unsinn. Enthält deine Spalte Wörter ("Yes", "Chrome", "Q3"), willst du barplot(table(x)). Enthält sie Messwerte (Größen, Preise, Reaktionszeiten), willst du das Histogramm und hist(x).
ggplot2: geom_col vs. geom_bar
Die ggplot2-Variante kommt in zwei Geoms, getrennt danach, ob das Zählen schon erledigt ist:
library(ggplot2)
# geom_bar(): raw observations in, counting done for you
ggplot(survey, aes(x = response)) +
geom_bar(fill = "steelblue")
# geom_col(): heights already computed, one row per bar
totals <- data.frame(day = c("Mon", "Tue", "Wed", "Thu", "Fri"),
visits = c(42, 51, 47, 60, 78))
ggplot(totals, aes(x = day, y = visits)) +
geom_col(fill = "steelblue")
geom_bar() ist table(), ins Diagramm eingebaut: Es nimmt eine Zeile pro Beobachtung und zählt aus. geom_col() nimmt voraggregierte Daten und bildet eine y-Spalte auf die Balkenhöhe ab - das Äquivalent zum klassischen barplot(). Bereits gezählte Daten an geom_bar() zu füttern ist die Standard-Anfängerfalle: Es zählt die Zeilen (je eine), und jeder Balken kommt gleich hoch heraus.
Was du mitnimmst
barplot(heights)zeichnet einen benannten Vektor - undtable(x)erzeugt genau diese Form aus rohen Kategoriedaten, deshalb istbarplot(table(x))das Kernidiom.- Sortiere die Tabelle (oder setz Faktorlevels) vor dem Zeichnen; die Balkenreihenfolge ist Teil der Botschaft.
- Eine Matrix ergibt gruppierte (
beside = TRUE) oder gestapelte (Voreinstellung) Balken; ergänzelegend.text = rownames(m). names.arg,col,las = 2undhoriz = TRUEerledigen die Beschriftung; horizontale Balken sind bei langen Namen am besten.- Kategorien → Balkendiagramm; numerische Klassen → Histogramm. In ggplot2: rohe Zeilen →
geom_bar(), berechnete Höhen →geom_col().
Als Nächstes: ggplot2 selbst - die Grammatik, die all diese Diagramme und viele mehr aus denselben wenigen kombinierbaren Bausteinen erzeugt.
Häufig gestellte Fragen
Wie erstellt man in R ein Balkendiagramm?
Ruf barplot() auf einem Vektor von Höhen auf. Gib dem Vektor Namen - oder bau ihn mit table(), dessen Ausgabe bereits benannt ist -, und jedes Element wird zu einem beschrifteten Balken: barplot(table(df$category)).
Wie erstellt man in R ein gruppiertes oder gestapeltes Balkendiagramm?
Übergib eine Matrix. Jede Spalte wird zu einer Position auf der Kategorienachse; beside = TRUE zeichnet die Zeilen als nebeneinanderstehende Balken (gruppiert), während die Voreinstellung beside = FALSE sie stapelt. Ergänze legend.text = rownames(m), damit Leser die Zeilen auseinanderhalten können.
Was ist der Unterschied zwischen barplot() und hist() in R?
barplot() vergleicht verschiedene Kategorien - ein Balken pro Kategorie, Balken getrennt. hist() klassiert eine numerische Variable in aufeinanderfolgende Intervalle - die Balken berühren sich, weil die Achse eine kontinuierliche Skala ist. Sind deine Werte Wörter, willst du barplot(table(x)); sind es Zahlen, willst du hist(x).
Sollte ich in ggplot2 geom_bar oder geom_col nutzen?
geom_bar() zählt für dich - gib ihm rohe Beobachtungen, und es zählt jede Kategorie aus. geom_col() zeichnet Werte, die du bereits berechnet hast - gib ihm eine Zeile pro Balken plus eine Höhenspalte. Vorgezählte Daten mit geom_bar() sind der klassische Fehler; sie brauchen geom_col().