0Pricing
Pandas & NumPy Academy · Lekcja

Wykresy słupkowe i histogramy

Wizualizuj liczności kategorii za pomocą ax.bar(), a rozkłady danych za pomocą ax.hist(), dostosowując liczbę przedziałów i kolor krawędzi.

Wykresy słupkowe i histogramy to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Wykresy słupkowe i histogramy

Wykresy słupkowe przedstawiają dane kategorialne: jedna kategoria odpowiada jednemu słupkowi, którego wysokość jest proporcjonalna do wartości. Odpowiadają na pytanie: „ile przypada na każdą kategorię?”. Histogramy przedstawiają rozkład ciągłej zmiennej liczbowej: dane są dzielone na przedziały, a wysokość słupka pokazuje liczbę lub częstość wartości w danym przedziale. Odpowiadają na pytanie: „jak rozkładają się te wartości?”. Do obu typów służą odpowiednio ax.bar() i ax.hist().

ax.bar() do pionowych wykresów słupkowych

ax.bar(x, height) rysuje pionowy wykres słupkowy, na którym x to sekwencja pozycji kategorii (lub etykiet), a height to wartość słupka. Najważniejsze parametry to: width (domyślnie 0.8, określa szerokość słupka względem odstępu), color, edgecolor oraz align ('center' lub 'edge'). Funkcja zwraca listę obiektów Artist typu Rectangle.

import matplotlib.pyplot as plt
import numpy as np

categories = ['East', 'West', 'North', 'South']
values = [420, 380, 310, 290]

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)
ax.set_title('Regional Revenue')
ax.set_xlabel('Region')
ax.set_ylabel('Revenue (USD)')
# plt.show()
plt.close()

Dostosowywanie wyglądu słupków

Kilka dostosowań może znacznie poprawić czytelność wykresów słupkowych: użyj jednego koloru akcentowego dla wszystkich słupków (lub tablicy kolorów, aby rozróżnić poszczególne słupki), dodaj etykiety wartości nad każdym słupkiem za pomocą ax.bar_label(), ustaw szerokość słupków tak, aby pozostawić trochę wolnego miejsca, oraz użyj ax.set_ylim(0, max * 1.15), aby zapewnić etykietom przestrzeń nad najwyższym słupkiem.

fig, ax = plt.subplots(figsize=(7, 4))
bars = ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)

# Add value labels above bars
ax.bar_label(bars, fmt='%d', padding=3, fontsize=10)

# Give space above bars for labels
ax.set_ylim(0, max(values) * 1.15)
ax.set_title('Regional Revenue')
plt.tight_layout()
plt.close()

Poziome wykresy słupkowe za pomocą ax.barh()

Użyj ax.barh(y, width) do tworzenia poziomych wykresów słupkowych. Poziome słupki są preferowane, gdy etykiety kategorii są długie (naturalnie czyta się je od lewej do prawej) lub gdy kategorii jest wiele (można je wtedy ułożyć bardziej kompaktowo). Obowiązują wszystkie te same parametry dostosowywania: height określa grubość słupka, a ax.barh_label() (lub ax.bar_label()) dodaje etykiety tekstowe.

import pandas as pd
df = pd.DataFrame({'region': categories, 'revenue': values})
df_sorted = df.sort_values('revenue')

fig, ax = plt.subplots(figsize=(7, 4))
ax.barh(df_sorted['region'], df_sorted['revenue'],
        color='steelblue', edgecolor='white', height=0.5)
ax.set_title('Revenue by Region (Sorted)')
ax.set_xlabel('Revenue (USD)')
plt.tight_layout()
plt.close()

Grupowane wykresy słupkowe

Aby porównać wiele grup obok siebie, utwórz grupowany wykres słupkowy, ręcznie przesuwając pozycje słupków. Oblicz środkowe pozycje każdej grupy, a następnie odejmij lub dodaj stałe przesunięcie dla każdej podgrupy. Suma szerokości słupków i odstępu między grupami musi wynosić 1.0, aby słupki na siebie nie nachodziły. Ustawienie ax.set_xticks() wyśrodkowuje etykiety znaczników między zgrupowanymi słupkami.

products = ['A', 'B', 'C']
q1 = [80, 120, 95]
q2 = [90, 110, 105]

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

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(x - width/2, q1, width, label='Q1', color='steelblue')
ax.bar(x + width/2, q2, width, label='Q2', color='coral')

ax.set_xticks(x)
ax.set_xticklabels(products)
ax.legend()
ax.set_title('Q1 vs Q2 Sales by Product')
plt.close()

Skumulowane wykresy słupkowe

Skumulowane słupki pokazują skład całości złożonej z wielu podgrup. Słupki drugiej grupy zaczynają się w miejscu zakończenia słupków pierwszej grupy, dzięki parametrowi bottom. Wartość bottom każdej kolejnej warstwy jest sumą skumulowaną wszystkich wcześniejszych warstw. Skumulowane słupki są przydatne, gdy chcemy jednocześnie pokazać sumę oraz udział każdego składnika.

q1_arr = np.array(q1)
q2_arr = np.array(q2)

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(products, q1_arr, label='Q1', color='steelblue')
ax.bar(products, q2_arr, bottom=q1_arr, label='Q2', color='coral')

ax.legend()
ax.set_title('Stacked Q1 + Q2 Sales by Product')
ax.set_ylabel('Total Sales')
plt.close()

ax.hist() do histogramów

ax.hist(data, bins) tworzy histogram. Parametr bins określa, na ile równych przedziałów zostaną podzielone dane (domyślnie 10). Możesz również przekazać listę krawędzi przedziałów o nierównych szerokościach. Najważniejsze parametry to: density=True normalizuje histogram do gęstości prawdopodobieństwa, edgecolor dodaje obramowania między słupkami, a color i alpha sterują wyglądem.

np.random.seed(42)
data = np.random.randn(500)  # 500 samples from standard normal

fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(data, bins=30, color='steelblue', edgecolor='white', alpha=0.7)
ax.set_title('Distribution of Values')
ax.set_xlabel('Value')
ax.set_ylabel('Count')
plt.close()

Wybór liczby przedziałów

Liczba przedziałów ma ogromny wpływ na wygląd histogramu. Zbyt mała liczba przedziałów ukrywa strukturę danych, a zbyt duża tworzy zaszumione piki. Typowe heurystyki to reguła Sturgesa (≈ log2(n) + 1), reguła Scotta oraz reguła Freedmana-Diaconisa. Matplotlib obsługuje je jako wartości tekstowe: bins='auto', bins='scott', bins='fd'. W analizie eksploracyjnej warto ręcznie wypróbować kilka wartości, a na potrzeby prezentacji wybrać liczbę przedziałów, która najlepiej przedstawia kształt rozkładu.

fig, axes = plt.subplots(1, 3, figsize=(12, 4))

for ax, b in zip(axes, [5, 30, 'auto']):
    ax.hist(data, bins=b, edgecolor='white', color='steelblue', alpha=0.7)
    ax.set_title(f'bins={b}')
    ax.set_xlabel('Value')

plt.tight_layout()
plt.close()

Nakładanie histogramów w celu porównania

Aby porównać dwa rozkłady na tych samych osiach, należy dwukrotnie wywołać ax.hist(), przekazując różne dane i kolory. Dla obu histogramów należy użyć alpha=0.5, aby nakładanie było widoczne. Następnie należy dodać etykiety i wywołać ax.legend(). Użycie density=True normalizuje oba histogramy do tej samej skali, gdy liczebności próbek są różne, dzięki czemu ich kształty można bezpośrednio porównywać.

group_a = np.random.randn(300)
group_b = np.random.randn(300) + 1.5  # shifted right

fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(group_a, bins=25, alpha=0.5, color='steelblue', label='Group A', density=True)
ax.hist(group_b, bins=25, alpha=0.5, color='coral', label='Group B', density=True)
ax.legend()
ax.set_title('Distribution Comparison')
plt.close()

Wykresy Series i DataFrame z Pandas

Metody DataFrame i Series .plot.bar() oraz .plot.hist() są dostępne bezpośrednio i automatycznie tworzą wykresy Matplotlib. Przyjmują parametr ax, który pozwala rysować na istniejącym obiekcie Axes. To najszybszy sposób tworzenia wykresów słupkowych na podstawie danych pogrupowanych w Pandas: należy obliczyć agregację za pomocą groupby, wywołać .plot.bar() dla wyniku, a następnie dostosować zwrócony obiekt Axes.

import pandas as pd
import numpy as np

df_sales = pd.DataFrame({
    'region': ['East', 'West', 'North', 'South'],
    'revenue': [420, 380, 310, 290]
}).set_index('region')

fig, ax = plt.subplots(figsize=(7, 4))
df_sales['revenue'].plot.bar(ax=ax, color='steelblue', rot=0)
ax.set_title('Revenue by Region')
plt.tight_layout()
plt.close()

Wybór między wykresem słupkowym a histogramem

Wybór między wykresem słupkowym a histogramem zależy od typu danych. Wykresu słupkowego należy użyć, gdy oś x przedstawia rozłączne, nieuporządkowane kategorie (nazwy produktów, regiony, segmenty użytkowników), a słupki przedstawiają zagregowane wartości dla poszczególnych kategorii. Histogramu należy użyć, gdy oś x przedstawia ciągłą zmienną liczbową i chcą Państwo pokazać, jak wartości rozkładają się w pewnym zakresie. Pomylenie tych typów wykresów jest częstym błędem wizualizacji, który wprowadza odbiorców w błąd co do typu danych.

# Bar chart: categorical x-axis (product names)
products = ['Widget', 'Gadget', 'Doohickey']
revenue = [500, 300, 200]
fig, ax = plt.subplots(figsize=(5, 3))
ax.bar(products, revenue, color='steelblue')
ax.set_title('Revenue per Product (Bar Chart)')
plt.close()

# Histogram: continuous x-axis (order sizes)
order_sizes = np.random.exponential(scale=50, size=300)
fig, ax = plt.subplots(figsize=(5, 3))
ax.hist(order_sizes, bins=20, color='coral', edgecolor='white')
ax.set_title('Distribution of Order Sizes (Histogram)')
plt.close()

Szybkie sprawdzenie

Proszę sprawdzić swoją wiedzę na temat wykresów słupkowych i histogramów z tego rozdziału.

Podsumowanie rozdziału

W tym rozdziale dowiedzieli się Państwo, że ax.bar() tworzy pionowe wykresy słupkowe, a ax.barh() tworzy poziome wykresy słupkowe; parametr bottom umożliwia tworzenie słupków skumulowanych; ax.hist() tworzy histogramy, których liczba przedziałów jest sterowana za pomocą bins; a density=True normalizuje histogramy na potrzeby rzetelnego porównania. W następnym rozdziale dodadzą Państwo etykiety osi, tytuły i zapiszą wykresy w jakości odpowiedniej do publikacji.

Często zadawane pytania

Czy lekcja „Wykresy słupkowe i histogramy” jest bezpłatna?

Tak — pełny tekst „Wykresy słupkowe i histogramy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wykresy słupkowe i histogramy”?

Wizualizuj liczności kategorii za pomocą ax.bar(), a rozkłady danych za pomocą ax.hist(), dostosowując liczbę przedziałów i kolor krawędzi. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Wykresy słupkowe i histogramy”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Architektura Figure i Axes
  2. Wykresy liniowe i punktowe
  3. Wykresy słupkowe i histogramy
  4. Etykiety, tytuły i zapisywanie wykresów
← Powrót do Pandas & NumPy Academy