W3docs

Matplotlib-Balkendiagramme in Python — Vollständiger Leitfaden

Vertikale, horizontale, gruppierte und gestapelte Balkendiagramme in Python mit Matplotlib erstellen. Mit Farben, Breite, Fehlerbalken und Speichern.

Die Funktionen bar() und barh() von Matplotlib ermöglichen das Erstellen von Balkendiagrammen, mit denen sich Mengen über Kategorien hinweg vergleichen lassen. Dieses Kapitel behandelt alles vom einfachsten Diagramm mit einer Datenreihe bis hin zu gruppierten und gestapelten Layouts — mit praktischen Anpassungsoptionen, die in realen Projekten häufig benötigt werden: Farben, Balkenbreite, Randgestaltung, Fehlerbalken und das Speichern des Ergebnisses in eine Datei.

Stellen Sie vor dem Start sicher, dass Matplotlib installiert ist:

pip install matplotlib

Wenn Sie neu in der Bibliothek sind, lesen Sie zuerst die Kapitel Matplotlib Introduction und Getting Started.

Was ist ein Balkendiagramm?

Ein Balkendiagramm verwendet rechteckige Balken, deren Länge einen numerischen Wert kodiert. So lassen sich Mengen über diskrete Kategorien hinweg leicht vergleichen — beispielsweise monatliche Umsätze, Bevölkerungszahlen nach Land oder Testergebnisse nach Fach.

Verwenden Sie ein Balkendiagramm, wenn:

  • Sie eine einzelne Kennzahl über Kategorien hinweg vergleichen (einfaches Balkendiagramm).
  • Sie zeigen möchten, wie sich ein Gesamtwert in Teile aufgliedert (gestapeltes Balkendiagramm).
  • Sie mehrere Kennzahlen nebeneinander für dieselben Kategorien vergleichen müssen (gruppiertes Balkendiagramm).
  • Ihre Kategoriebezeichnungen lang sind und sich horizontal besser lesen lassen (horizontales Balkendiagramm).

Einfaches vertikales Balkendiagramm erstellen

Die Funktion plt.bar(x, height) nimmt eine Folge von Kategoriebezeichnungen (oder numerischen Positionen) und eine passende Folge von Balkenhöhen entgegen.

import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D', 'E']
values     = [10, 24, 36, 40, 15]

plt.bar(categories, values)

plt.title('Sample Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')

plt.tight_layout()
plt.show()

plt.tight_layout() verhindert, dass Achsenbeschriftungen abgeschnitten werden — eine gute Gewohnheit, die vor jedem show()- oder savefig()-Aufruf hinzugefügt werden sollte.

Balkendarstellung anpassen

Farbe

Übergeben Sie einen einzelnen Farbnamen, einen Hex-String oder eine Liste mit Farben für jeden Balken an den Parameter color:

import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D', 'E']
values     = [10, 24, 36, 40, 15]

# One color for all bars
plt.bar(categories, values, color='steelblue')

plt.title('Steelblue Bars')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()

Um jeden Balken unterschiedlich einzufärben, übergeben Sie eine Liste:

import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D', 'E']
values     = [10, 24, 36, 40, 15]
colors     = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6']

plt.bar(categories, values, color=colors)

plt.title('Multi-Color Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()

Balkenbreite und Randfarbe

Der Standard-width-Wert beträgt 0.8 (80 % des Abstands zwischen Tick-Positionen). Verringern Sie ihn für eine leichtere Optik oder erhöhen Sie ihn, um mehr Platz zu füllen. Mit edgecolor wird ein Rahmen um jeden Balken gezeichnet:

import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D', 'E']
values     = [10, 24, 36, 40, 15]

plt.bar(
    categories, values,
    width=0.5,
    color='cornflowerblue',
    edgecolor='navy',
    linewidth=1.2,
)

plt.title('Custom Width and Edge')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()

Legende hinzufügen

Übergeben Sie einen label-String an bar() und rufen Sie dann plt.legend() auf:

import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D', 'E']
values     = [10, 24, 36, 40, 15]

plt.bar(categories, values, color='teal', label='2024 Sales')
plt.legend()

plt.title('Bar Chart with Legend')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()

Tick-Beschriftungen drehen

Lange Kategorienamen überlappen sich, wenn Sie sie nicht mit plt.xticks(rotation=...) drehen:

import matplotlib.pyplot as plt

months = ['January', 'February', 'March', 'April', 'May', 'June']
sales  = [120, 95, 140, 160, 130, 175]

plt.bar(months, sales, color='darkorange')
plt.xticks(rotation=45, ha='right')   # ha='right' aligns the labels nicely

plt.title('Monthly Sales')
plt.xlabel('Month')
plt.ylabel('Units Sold')
plt.tight_layout()
plt.show()

Horizontale Balkendiagramme

plt.barh(y, width) zeichnet Balken, die sich horizontal erstrecken. Dies ist besonders nützlich, wenn Kategoriebezeichnungen lang sind, da sie auf der y-Achse mit ausreichend horizontalem Platz erscheinen.

import matplotlib.pyplot as plt

languages  = ['Python', 'JavaScript', 'Java', 'C#', 'TypeScript']
popularity = [30.3, 25.1, 17.8, 12.4, 9.6]

plt.barh(languages, popularity, color='mediumseagreen')

plt.title('Programming Language Popularity (%)')
plt.xlabel('Share (%)')
plt.ylabel('Language')
plt.tight_layout()
plt.show()

Tipp: Sortieren Sie die Daten vor dem Plotten, damit die beliebteste Kategorie oben erscheint:

import matplotlib.pyplot as plt

languages  = ['Python', 'JavaScript', 'Java', 'C#', 'TypeScript']
popularity = [30.3, 25.1, 17.8, 12.4, 9.6]

# Sort ascending so the highest bar ends up at the top after barh reversal
pairs      = sorted(zip(popularity, languages))
popularity_sorted, languages_sorted = zip(*pairs)

plt.barh(languages_sorted, popularity_sorted, color='mediumseagreen')

plt.title('Programming Language Popularity (sorted)')
plt.xlabel('Share (%)')
plt.tight_layout()
plt.show()

Gruppierte Balkendiagramme

Ein gruppiertes (nebeneinanderstehendes) Balkendiagramm vergleicht zwei oder mehr Datenreihen für dieselbe Menge von Kategorien. Matplotlib besitzt keine dedizierte Funktion dafür — es wird erstellt, indem die x-Positionen jeder Reihe mithilfe von NumPy verschoben werden:

import matplotlib.pyplot as plt
import numpy as np

categories = ['Q1', 'Q2', 'Q3', 'Q4']
sales_2023 = [120, 135, 150, 170]
sales_2024 = [140, 160, 145, 195]

x     = np.arange(len(categories))  # [0, 1, 2, 3]
width = 0.35                         # width of each individual bar

fig, ax = plt.subplots()

bars1 = ax.bar(x - width / 2, sales_2023, width, label='2023', color='steelblue')
bars2 = ax.bar(x + width / 2, sales_2024, width, label='2024', color='darkorange')

ax.set_title('Quarterly Sales Comparison')
ax.set_xlabel('Quarter')
ax.set_ylabel('Units Sold')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()

plt.tight_layout()
plt.show()

Wichtige Punkte:

  • x - width / 2 verschiebt die erste Reihe nach links; x + width / 2 verschiebt die zweite Reihe nach rechts, sodass die Balken nebeneinander stehen.
  • ax.set_xticks(x) und ax.set_xticklabels(categories) platzieren die Kategoriebezeichnungen in der Mitte jeder Gruppe.
  • Die objektorientierte API (fig, ax = plt.subplots()) ist für gruppierte Diagramme vorzuziehen, da sie explizite Kontrolle über jede Achse gibt.

Wertebeschriftungen auf Balken hinzufügen

Sie können jeden Balken mit seinem Wert beschriften, indem Sie ax.bar_label() verwenden (hinzugefügt in Matplotlib 3.4):

import matplotlib.pyplot as plt
import numpy as np

categories = ['Q1', 'Q2', 'Q3', 'Q4']
sales_2023 = [120, 135, 150, 170]
sales_2024 = [140, 160, 145, 195]

x     = np.arange(len(categories))
width = 0.35

fig, ax = plt.subplots()
bars1 = ax.bar(x - width / 2, sales_2023, width, label='2023', color='steelblue')
bars2 = ax.bar(x + width / 2, sales_2024, width, label='2024', color='darkorange')

ax.bar_label(bars1, padding=3)
ax.bar_label(bars2, padding=3)

ax.set_title('Quarterly Sales with Labels')
ax.set_xlabel('Quarter')
ax.set_ylabel('Units Sold')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()

plt.tight_layout()
plt.show()

Gestapelte Balkendiagramme

Ein gestapeltes Balkendiagramm legt Reihen übereinander und zeigt, wie einzelne Teile zu einem Gesamtwert beitragen. Verwenden Sie den Parameter bottom, um Matplotlib mitzuteilen, wo jede Reihe beginnen soll:

import matplotlib.pyplot as plt
import numpy as np

categories = ['A', 'B', 'C', 'D', 'E']
series1    = [10, 24, 36, 40, 15]
series2    = [ 5, 12, 15, 20, 10]
series3    = [ 8,  6, 10, 12,  7]

x = np.arange(len(categories))

plt.bar(x, series1, label='Group 1', color='steelblue')
plt.bar(x, series2, label='Group 2', color='darkorange',
        bottom=series1)
plt.bar(x, series3, label='Group 3', color='seagreen',
        bottom=np.array(series1) + np.array(series2))

plt.xticks(x, categories)
plt.title('Stacked Bar Chart')
plt.xlabel('Category')
plt.ylabel('Total Value')
plt.legend()
plt.tight_layout()
plt.show()

Der bottom-Wert für die dritte Reihe ist die elementweise Summe der ersten beiden, sodass jeder Balken genau dort beginnt, wo der vorherige aufgehört hat. Die Verwendung von np.array() stellt sicher, dass die Addition mit Listen korrekt funktioniert.

Fehlerbalken

Wenn Ihre Daten Unsicherheiten oder Variabilität aufweisen (z. B. Standardabweichung über wiederholte Messungen), fügen Sie Fehlerbalken mit dem Parameter yerr hinzu:

import matplotlib.pyplot as plt
import numpy as np

categories    = ['Control', 'Treatment A', 'Treatment B', 'Treatment C']
means         = [5.2, 7.8, 6.1, 9.4]
std_devs      = [0.5, 0.8, 0.6, 1.1]

plt.bar(
    categories, means,
    yerr=std_devs,
    capsize=5,           # width of the error bar caps
    color='cornflowerblue',
    edgecolor='black',
    linewidth=0.8,
)

plt.title('Experimental Results with Error Bars')
plt.xlabel('Group')
plt.ylabel('Mean Value')
plt.tight_layout()
plt.show()

capsize steuert die horizontalen Kappen am oberen und unteren Ende jedes Fehlerbalkens; ein Wert von 4–6 ist in der Regel gut lesbar.

Balkendiagramm in Datei speichern

Verwenden Sie plt.savefig() anstelle von plt.show() (oder rufen Sie es vor show() auf). Das Format kann über die Dateiendung angegeben werden:

import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D', 'E']
values     = [10, 24, 36, 40, 15]

plt.bar(categories, values, color='steelblue')
plt.title('Saved Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()

# Save as PNG at 150 dpi
plt.savefig('bar_chart.png', dpi=150)

# Save as vector PDF (ideal for publications)
plt.savefig('bar_chart.pdf')

plt.show()

Gängige Formatoptionen: png, pdf, svg, eps. Verwenden Sie svg oder pdf, wenn Sie ein skalierbares, druckfertiges Bild benötigen.

Figurengröße steuern

Standardmäßig erstellt Matplotlib eine 6,4 × 4,8 Zoll große Figur. Übergeben Sie figsize=(width, height) an plt.figure() oder plt.subplots(), um dies zu überschreiben:

import matplotlib.pyplot as plt

categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
              'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
values     = [80, 70, 95, 110, 130, 150, 160, 155, 120, 100, 85, 90]

fig, ax = plt.subplots(figsize=(12, 5))  # wider figure for 12 months
ax.bar(categories, values, color='tomato')
ax.set_title('Monthly Data')
ax.set_xlabel('Month')
ax.set_ylabel('Value')

plt.tight_layout()
plt.savefig('monthly_bar_chart.png', dpi=150)
plt.show()

Kurzübersicht

AufgabeCode
Vertikales Balkendiagrammplt.bar(x, y)
Horizontales Balkendiagrammplt.barh(y, width)
Farbe ändernplt.bar(x, y, color='steelblue')
Breite ändernplt.bar(x, y, width=0.5)
Gestapelte Balkenplt.bar(x, y2, bottom=y1)
Fehlerbalkenplt.bar(x, y, yerr=errors, capsize=5)
Wertebeschriftungen hinzufügenax.bar_label(bars, padding=3)
x-Beschriftungen drehenplt.xticks(rotation=45, ha='right')
In Datei speichernplt.savefig('file.png', dpi=150)

Verwandte Kapitel

Was this page helpful?