6.4 Wykres skumulowany kolumnowy

Matura maj 2025 - Matura z informatyki: arkusze krok po kroku (Python)

Druga część zadania 6.4: wykres. W Pythonie rysuje go biblioteka **matplotlib** (`import matplotlib.pyplot as plt`, za pierwszym razem ładuje się chwilę). Skumulowany wykres kolumnowy to słupki kolejnych lat ustawione jeden na drugim: `plt.bar` dostaje nazwy obszarów, liczby przewozów danego roku i `bottom`, czyli wysokość, na której słupek zaczyna się (suma poprzednich lat). `label` to podpis serii w legendzie, a `plt.show()` pokazuje wykres w konsoli. Wymagany opis z arkusza: nazwy obszarów na osi X, opisy osi ("nazwy obszarów", "liczba przewozów ładunku"), tytuł i legenda z latami.

from datetime import date, timedelta

loads = []
with open("martianeum_przyklad.txt", encoding="utf-8") as f:
    next(f)  # pierwszy wiersz to nagłówek
    for line in f:
        day, area, mass, share = line.rstrip("\n").split("\t")
        # liczby z przecinkiem dziesiętnym: zamiana na kropkę przed float
        loads.append((date.fromisoformat(day), area, float(mass.replace(",", ".")), float(share.replace(",", "."))))

# 6.1 masa minerału = masa ładunku * zawartość / 100, tylko gdy zawartość >= 1%
total_mass = sum(mass for day, area, mass, share in loads)
mined = sum(mass * share / 100 for day, area, mass, share in loads if share >= 1)

# 6.2 średnia masa ładunku dla obszaru: suma i licznik w słownikach
sums, counts = {}, {}
for day, area, mass, share in loads:
    sums[area] = sums.get(area, 0) + mass
    counts[area] = counts.get(area, 0) + 1
lightest = min(sums, key=lambda area: sums[area] / counts[area])

# 6.3 numer okresu 7-dniowego = liczba dni od pierwszego dnia // 7
first = loads[0][0]
weeks = {}
for day, area, mass, share in loads:
    week = (day - first).days // 7
    weeks[week] = weeks.get(week, 0) + mass
best_week = max(weeks, key=weeks.get)
best_start = first + timedelta(days=7 * best_week)

# 6.4 zestawienie: obszar -> rok -> liczba przewozów
years = sorted({day.year for day, area, mass, share in loads})
table = {}
for day, area, mass, share in loads:
    row = table.setdefault(area, {})
    row[day.year] = row.get(day.year, 0) + 1

print("6.1", round(total_mass, 1), round(mined, 4))
print("6.2", lightest)
print("6.3", round(weeks[best_week], 1), best_start)
print("6.4", *years)
for area in sorted(table):
    print(area, *[table[area].get(year, 0) for year in years])

# 6.4 wykres skumulowany kolumnowy: słupki kolejnych lat jeden na drugim
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))  # szerszy wykres: 30 obszarów na osi X
areas = sorted(table)
bottom = [0] * len(areas)
for year in years:
    counts = [table[area].get(year, 0) for area in areas]
    plt.bar(areas, counts, bottom=bottom, label=str(year))
    bottom = [b + c for b, c in zip(bottom, counts)]
plt.xlabel("nazwy obszarów")
plt.ylabel("liczba przewozów ładunku")
plt.title("Przewozy ładunku z obszarów w kolejnych latach")
plt.xticks(rotation=90)  # długie nazwy obszarów pionowo
plt.legend()
plt.tight_layout()  # miejsce na obrócone podpisy
plt.show()

Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.

Wszystkie lekcje kursu Matura z informatyki: arkusze krok po kroku·Zaloguj się, aby zapisać postęp na koncie.