19. Python – Wykresy (Matplotlib i Seaborn)


Szybki quiz – przypomnienie poprzedniej lekcji

1. Plik dane.csv zawiera wiersz Jan,Kowalski,25,Warszawa. Co się stanie po wykonaniu kodu?

import csv

with open('dane.csv', 'r', encoding='utf-8') as plik:
    czytnik = csv.reader(plik)
    next(czytnik)  # pominięcie nagłówków
    for wiersz in czytnik:
        print(wiersz[2] + 1)
Odpowiedź

Odpowiedź: Wystąpi TypeError. csv.reader zwraca wszystkie wartości jako napisy, więc wiersz[2] to '25', a nie liczba. Przed dodawaniem trzeba użyć int(wiersz[2]).

2. Co jest nie tak w zapisie do pliku CSV? Co należy dodać?

with open('wynik.csv', 'w') as plik:
    writer = csv.writer(plik)
    writer.writerows(dane)
Odpowiedź

Odpowiedź: Brakuje newline='', bez którego w Windows pojawiają się puste linie między wierszami. Warto też dodać encoding='utf-8'.

3. Znajdź błąd w filtrowaniu DataFrame i popraw go:

df[df['Wiek'] > 25 & df['Miasto'] == 'Warszawa']
Odpowiedź

Odpowiedź: Każdy warunek musi być w osobnych nawiasach, bo & ma wyższy priorytet niż > i ==.
Poprawnie: df[(df['Wiek'] > 25) & (df['Miasto'] == 'Warszawa')]

4. Co zostanie wyświetlone?

df = pd.DataFrame({
    'Imie': ['Jan', 'Anna', 'Piotr'],
    'Wiek': [25, 30, 28]
})
print(df.iloc[1, 1])
Odpowiedź

Odpowiedź: 30. iloc liczy pozycje od zera: wiersz 1 to Anna, kolumna 1 to Wiek.

5. Uzupełnij kod tak, aby wyświetlił średni wiek w każdym mieście:

print(df.______('Miasto')['Wiek'].______())
Odpowiedź

Odpowiedź: groupby oraz mean.

6. Jak policzyć brakujące wartości w każdej kolumnie DataFrame? Jak potem usunąć wiersze z brakami?

Odpowiedź

Odpowiedź: df.isnull().sum() liczy braki w każdej kolumnie. df.dropna() usuwa wiersze z brakami (alternatywa: fillna() wypełnia je wartością).


Wprowadzenie

Wizualizacja danych to kluczowy element analizy – pozwala szybko zrozumieć dane i wyciągnąć wnioski.

Biblioteki:

  • Matplotlib – podstawowa, najpopularniejsza
  • Seaborn – ładniejsze wykresy, bazuje na Matplotlib
  • Plotly – interaktywne wykresy

Matplotlib – podstawy

Instalacja

pip install matplotlib

Pierwszy wykres – linia

import matplotlib.pyplot as plt

# Dane
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# Stwórz wykres
plt.plot(x, y)

# Opisy
plt.title('Mój pierwszy wykres')
plt.xlabel('Oś X')
plt.ylabel('Oś Y')

# Pokaż
plt.show()

Personalizacja linii

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# Styl linii
plt.plot(x, y, 
         color='red',          # Kolor
         linewidth=2,          # Grubość
         linestyle='--',       # Styl: '-', '--', '-.', ':'
         marker='o',           # Markery: 'o', 's', '^', '*'
         markersize=8,         # Rozmiar markerów
         label='Dane 1')       # Etykieta

plt.title('Wykres z personalizacją')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()  # Pokaż legendę
plt.grid(True)  # Siatka
plt.show()

Wiele linii na jednym wykresie

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
y3 = [3, 5, 4, 6, 8]

plt.plot(x, y1, label='Linia 1', marker='o')
plt.plot(x, y2, label='Linia 2', marker='s')
plt.plot(x, y3, label='Linia 3', marker='^')

plt.title('Wiele linii')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.show()

Typy wykresów

Wykres punktowy (scatter)

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5, 6]
y = [2, 4, 5, 7, 8, 10]

plt.scatter(x, y, 
            s=100,           # Rozmiar punktów
            c='red',         # Kolor
            alpha=0.6,       # Przezroczystość
            edgecolors='black')  # Obramowanie

plt.title('Wykres punktowy')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Wykres słupkowy (bar)

import matplotlib.pyplot as plt

kategorie = ['A', 'B', 'C', 'D', 'E']
wartosci = [23, 45, 56, 78, 32]

plt.bar(kategorie, wartosci, 
        color='skyblue',
        edgecolor='black',
        width=0.6)

plt.title('Wykres słupkowy')
plt.xlabel('Kategoria')
plt.ylabel('Wartość')
plt.show()

Wykres słupkowy poziomy

import matplotlib.pyplot as plt

kategorie = ['Produkt A', 'Produkt B', 'Produkt C']
wartosci = [150, 230, 180]

plt.barh(kategorie, wartosci, color='lightgreen')
plt.title('Sprzedaż produktów')
plt.xlabel('Liczba sprzedanych')
plt.show()

Histogram

import matplotlib.pyplot as plt
import numpy as np

# Dane - rozkład normalny
dane = np.random.randn(1000)

plt.hist(dane, 
         bins=30,           # Liczba słupków
         color='purple',
         alpha=0.7,
         edgecolor='black')

plt.title('Histogram')
plt.xlabel('Wartość')
plt.ylabel('Częstość')
plt.show()

Wykres kołowy (pie)

import matplotlib.pyplot as plt

kategorie = ['Python', 'Java', 'JavaScript', 'C++']
udzialy = [40, 25, 20, 15]

plt.pie(udzialy, 
        labels=kategorie,
        autopct='%1.1f%%',  # Pokaż procenty
        startangle=90,       # Kąt początkowy
        colors=['#ff9999', '#66b3ff', '#99ff99', '#ffcc99'])

plt.title('Popularne języki programowania')
plt.show()

Wyciągnięty kawałek (explode)

import matplotlib.pyplot as plt

kategorie = ['Python', 'Java', 'JavaScript', 'C++']
udzialy = [40, 25, 20, 15]
explode = [0.1, 0, 0, 0]  # Wyciągnij pierwszy

plt.pie(udzialy, 
        labels=kategorie,
        autopct='%1.1f%%',
        explode=explode,
        shadow=True)

plt.title('Języki programowania')
plt.show()

Wykres pudełkowy (box plot)

import matplotlib.pyplot as plt
import numpy as np

# Dane dla różnych grup
dane1 = np.random.normal(100, 10, 200)
dane2 = np.random.normal(90, 20, 200)
dane3 = np.random.normal(80, 5, 200)

dane = [dane1, dane2, dane3]

plt.boxplot(dane, labels=['Grupa A', 'Grupa B', 'Grupa C'])
plt.title('Box Plot')
plt.ylabel('Wartości')
plt.show()

Wiele wykresów (subplots)

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

# Stwórz siatkę 2x2
fig, axes = plt.subplots(2, 2, figsize=(10, 8))

# Wykres 1
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('sin(x)')

# Wykres 2
axes[0, 1].plot(x, np.cos(x), 'r')
axes[0, 1].set_title('cos(x)')

# Wykres 3
axes[1, 0].plot(x, x**2, 'g')
axes[1, 0].set_title('x²')

# Wykres 4
axes[1, 1].plot(x, np.exp(x/10), 'purple')
axes[1, 1].set_title('e^(x/10)')

plt.tight_layout()  # Automatyczne dopasowanie
plt.show()

Zapisywanie wykresów

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.title('Mój wykres')

# Zapisz do pliku
plt.savefig('wykres.png', dpi=300, bbox_inches='tight')
# plt.savefig('wykres.pdf')  # PDF
# plt.savefig('wykres.svg')  # SVG

print("Wykres zapisany!")

Pandas + Matplotlib

Pandas ma wbudowaną integrację z Matplotlib.

import pandas as pd
import matplotlib.pyplot as plt

# DataFrame
df = pd.DataFrame({
    'Miesiąc': ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj'],
    'Sprzedaż': [120, 150, 180, 160, 200]
})

# Wykres bezpośrednio z DataFrame
df.plot(x='Miesiąc', y='Sprzedaż', kind='bar', color='skyblue')
plt.title('Sprzedaż miesięczna')
plt.ylabel('Sprzedaż')
plt.show()

# Inne typy: 'line', 'bar', 'barh', 'hist', 'box', 'scatter', 'pie'

Seaborn – piękniejsze wykresy

Instalacja

pip install seaborn

Podstawy Seaborn

import seaborn as sns
import matplotlib.pyplot as plt

# Ustaw styl
sns.set_style('darkgrid')  # 'darkgrid', 'whitegrid', 'dark', 'white', 'ticks'

# Dane
tips = sns.load_dataset('tips')  # Przykładowy zbiór danych

# Wykres punktowy z linią trendu
sns.scatterplot(data=tips, x='total_bill', y='tip')
plt.title('Rachunek vs Napiwek')
plt.show()

Wykres z regresją liniową

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Scatter plot + linia trendu
sns.regplot(data=tips, x='total_bill', y='tip')
plt.title('Rachunek vs Napiwek (z trendem)')
plt.show()

Wykres skrzypcowy (violin)

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.violinplot(data=tips, x='day', y='total_bill')
plt.title('Rachunki według dni tygodnia')
plt.show()

Heatmapa (korelacja)

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# Dane
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [2, 4, 6, 8, 10],
    'C': [5, 4, 3, 2, 1]
})

# Macierz korelacji
korelacja = df.corr()

# Heatmapa
sns.heatmap(korelacja, 
            annot=True,      # Pokaż wartości
            cmap='coolwarm', # Paleta kolorów
            center=0)        # Wyśrodkuj na 0

plt.title('Macierz korelacji')
plt.show()

Pair plot

import seaborn as sns
import matplotlib.pyplot as plt

# Załaduj dane
iris = sns.load_dataset('iris')

# Wykres wszystkich par zmiennych
sns.pairplot(iris, hue='species')
plt.show()

Praktyczne przykłady

Przykład 1: Analiza sprzedaży

import pandas as pd
import matplotlib.pyplot as plt

# Dane sprzedażowe
sprzedaz = pd.DataFrame({
    'Miesiąc': ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze'],
    'Sprzedaż': [12000, 15000, 13000, 18000, 22000, 25000],
    'Cel': [15000, 15000, 15000, 20000, 20000, 20000]
})

# Wykres
plt.figure(figsize=(10, 6))
plt.plot(sprzedaz['Miesiąc'], sprzedaz['Sprzedaż'], 
         marker='o', linewidth=2, label='Rzeczywista')
plt.plot(sprzedaz['Miesiąc'], sprzedaz['Cel'], 
         marker='s', linewidth=2, linestyle='--', label='Cel')

plt.title('Sprzedaż vs Cel - 2024', fontsize=16)
plt.xlabel('Miesiąc')
plt.ylabel('Sprzedaż (PLN)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Przykład 2: Porównanie produktów

import matplotlib.pyplot as plt

produkty = ['Laptop', 'Telefon', 'Tablet', 'Monitor', 'Klawiatura']
sprzedaz_q1 = [45, 78, 32, 56, 89]
sprzedaz_q2 = [52, 85, 38, 61, 95]

x = range(len(produkty))
width = 0.35

plt.figure(figsize=(10, 6))
plt.bar([i - width/2 for i in x], sprzedaz_q1, width, label='Q1', color='skyblue')
plt.bar([i + width/2 for i in x], sprzedaz_q2, width, label='Q2', color='lightgreen')

plt.title('Sprzedaż produktów - Q1 vs Q2')
plt.xlabel('Produkt')
plt.ylabel('Liczba sprzedanych')
plt.xticks(x, produkty)
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()

Przykład 3: Rozkład wieku

import matplotlib.pyplot as plt
import numpy as np

# Symulacja danych
wiek = np.random.normal(35, 10, 1000)  # Średnia 35, odchylenie 10

plt.figure(figsize=(10, 6))
plt.hist(wiek, bins=30, color='coral', edgecolor='black', alpha=0.7)
plt.axvline(wiek.mean(), color='red', linestyle='--', linewidth=2, label=f'Średnia: {wiek.mean():.1f}')

plt.title('Rozkład wieku pracowników')
plt.xlabel('Wiek')
plt.ylabel('Liczba osób')
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.show()

Przykład 4: Dashboard z wieloma wykresami

import matplotlib.pyplot as plt
import pandas as pd

# Dane
df = pd.DataFrame({
    'Miesiąc': ['Sty', 'Lut', 'Mar', 'Kwi'],
    'Przychód': [12000, 15000, 13000, 18000],
    'Koszty': [8000, 9000, 8500, 11000],
    'Klienci': [120, 145, 130, 170]
})

df['Zysk'] = df['Przychód'] - df['Koszty']

# Stwórz dashboard
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle('Dashboard Sprzedażowy - Q1 2024', fontsize=16)

# Wykres 1: Przychód i koszty
axes[0, 0].plot(df['Miesiąc'], df['Przychód'], marker='o', label='Przychód')
axes[0, 0].plot(df['Miesiąc'], df['Koszty'], marker='s', label='Koszty')
axes[0, 0].set_title('Przychód i Koszty')
axes[0, 0].set_ylabel('PLN')
axes[0, 0].legend()
axes[0, 0].grid(True, alpha=0.3)

# Wykres 2: Zysk
axes[0, 1].bar(df['Miesiąc'], df['Zysk'], color='green', alpha=0.7)
axes[0, 1].set_title('Zysk')
axes[0, 1].set_ylabel('PLN')
axes[0, 1].grid(axis='y', alpha=0.3)

# Wykres 3: Liczba klientów
axes[1, 0].plot(df['Miesiąc'], df['Klienci'], marker='D', color='purple', linewidth=2)
axes[1, 0].set_title('Liczba klientów')
axes[1, 0].set_ylabel('Klienci')
axes[1, 0].grid(True, alpha=0.3)

# Wykres 4: Udział przychodów
axes[1, 1].pie(df['Przychód'], labels=df['Miesiąc'], autopct='%1.1f%%', startangle=90)
axes[1, 1].set_title('Udział przychodów')

plt.tight_layout()
plt.show()

Podsumowanie

Matplotlib:

  • plt.plot() – wykres liniowy
  • plt.scatter() – wykres punktowy
  • plt.bar() / plt.barh() – słupkowy
  • plt.hist() – histogram
  • plt.pie() – kołowy
  • plt.boxplot() – pudełkowy
  • plt.subplots() – wiele wykresów

Personalizacja:

  • color, linewidth, linestyle, marker
  • title(), xlabel(), ylabel()
  • legend(), grid()
  • savefig() – zapis do pliku

Seaborn:

  • Ładniejsze style
  • scatterplot(), regplot(), violinplot()
  • heatmap() – korelacja
  • pairplot() – wszystkie pary

Integracja z Pandas:

  • df.plot() – bezpośrednie wykresy z DataFrame

PODSUMOWANIE

  • Wykres w Matplotlib budujesz zawsze w tej samej kolejności: import → dane → wykres → opisy → plt.show().
  • Import: import matplotlib.pyplot as plt. Biblioteki instalujesz przez pip install matplotlib i pip install seaborn.
  • Seaborn bazuje na Matplotlib. Wykresy Seaborn nadal wyświetlasz i opisujesz przez plt.
  • Dla plt.plot(x, y) listy x i y muszą mieć tę samą długość.
  • Typ wykresu dobierasz do danych:
    • zmiana wartości (linia): plot
    • zależność dwóch zmiennych: scatter
    • porównanie kategorii: bar / barh
    • rozkład wartości: hist
    • udział w całości: pie
    • rozrzut i wartości odstające: boxplot
  • Parametry linii: color, linewidth, linestyle, marker, markersize, label.
  • label samo nic nie pokaże. Legenda pojawia się dopiero po plt.legend().
  • Kilka linii na jednym wykresie to kilka wywołań plt.plot() przed jednym plt.show().
  • Przy kilku wykresach obok siebie: fig, axes = plt.subplots(wiersze, kolumny). Wykres wybierasz przez axes[wiersz, kolumna], a tytuł ustawiasz przez set_title(), nie title().
  • tight_layout() poprawia rozmieszczenie wykresów, figsize=(szer, wys) ustawia rozmiar.
  • savefig('plik.png', dpi=300, bbox_inches='tight') zapisuje wykres do pliku (PNG, PDF, SVG – zależnie od rozszerzenia).
  • Pandas ma wbudowane wykresy: df.plot(x=..., y=..., kind=...). Tytuł i show() nadal dodajesz przez plt.
  • Seaborn przyjmuje DataFrame i nazwy kolumn: sns.scatterplot(data=df, x='kol1', y='kol2').
  • Heatmapa wymaga macierzy korelacji: sns.heatmap(df.corr(), annot=True).
  • Typowe błędy: różne długości list, brak legend(), brak show(), pomylenie plt.title z set_title, przekazanie do bar() złych argumentów (najpierw kategorie, potem wartości).

Minimum, które powinno wejść w pamięć

Jeżeli masz zapamiętać tylko kilka rzeczy z tej lekcji, zapamiętaj te:

  • Schemat: import matplotlib.pyplot as plt → dane → plt.plot(x, y) → opisy → plt.show().
  • x i y muszą mieć tyle samo elementów.
  • Wybór wykresu: plot = linia, scatter = punkty, bar/barh = słupki, hist = rozkład, pie = udział w całości.
  • label='...' + plt.legend() – bez drugiego legendy nie będzie.
  • plt.subplots(2, 2) → axes[0, 1] oznacza pierwszy wiersz, druga kolumna. Dla takiego wykresu używasz set_title().
  • plt.savefig('wykres.png', dpi=300) zapisuje wykres do pliku.
  • df.plot(x='kolumna1', y='kolumna2', kind='bar') rysuje wykres prosto z DataFrame.
  • Seaborn: sns.scatterplot(data=df, x='...', y='...'). Heatmapa: sns.heatmap(df.corr(), annot=True).

Ściągawka – najważniejsze polecenia i składnia

Instalacja i import

pip install matplotlib seaborn
import matplotlib.pyplot as plt
import seaborn as sns

Typy wykresów (Matplotlib)

WykresPoleceniePrzykład
liniowyplt.plot()plt.plot(x, y)
punktowyplt.scatter()plt.scatter(x, y, s=100, c='red', alpha=0.6)
słupkowyplt.bar()plt.bar(kategorie, wartosci)
słupkowy poziomyplt.barh()plt.barh(kategorie, wartosci)
histogramplt.hist()plt.hist(dane, bins=30)
kołowyplt.pie()plt.pie(udzialy, labels=kategorie, autopct='%1.1f%%')
pudełkowyplt.boxplot()plt.boxplot([d1, d2], labels=['A', 'B'])

Opisy i wygląd

plt.title('Tytuł')
plt.xlabel('Oś X')
plt.ylabel('Oś Y')
plt.legend()                # wymaga label=... w wykresie
plt.grid(True)              # siatka
plt.figure(figsize=(10, 6)) # rozmiar wykresu
plt.tight_layout()

Parametry linii

plt.plot(x, y, color='red', linewidth=2, linestyle='--',
         marker='o', markersize=8, label='Dane 1')
  • linestyle: '-', '--', '-.', ':'
  • marker: 'o', 's', '^', '*'

Wykres kołowy – dodatki

  • autopct='%1.1f%%' – pokazuje procenty
  • startangle=90 – kąt początkowy
  • explode=[0.1, 0, 0, 0] – wysuwa wybrany kawałek

Wiele wykresów

fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes[0, 0].plot(x, y)
axes[0, 0].set_title('Tytuł')
plt.tight_layout()
plt.show()

Zapis do pliku

plt.savefig('wykres.png', dpi=300, bbox_inches='tight')

Pandas → wykres

df.plot(x='Miesiąc', y='Sprzedaż', kind='bar')
plt.show()
# kind: 'line', 'bar', 'barh', 'hist', 'box', 'scatter', 'pie'

Seaborn

sns.set_style('darkgrid')                         # także 'whitegrid', 'dark', 'white', 'ticks'
sns.scatterplot(data=df, x='kol1', y='kol2')
sns.regplot(data=df, x='kol1', y='kol2')          # punkty + linia trendu
sns.violinplot(data=df, x='kategoria', y='liczba')
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', center=0)
sns.pairplot(df, hue='kolumna')

Quiz – sprawdź się

1. Dobierz typ wykresu (plot, scatter, bar, hist, pie) do zadania:
a) pokazanie, jaki procent budżetu przypada na poszczególne kategorie wydatków,
b) pokazanie rozkładu wzrostu 1000 osób,
c) sprawdzenie, czy wyższy rachunek oznacza wyższy napiwek (dwie zmienne liczbowe),
d) porównanie sprzedaży pięciu produktów.

2. Co się stanie po uruchomieniu tego kodu?

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [2, 4]
plt.plot(x, y)
plt.show()

3. Programista dodał label='Dane 1' do wykresu, ale legenda się nie pojawia. Dlaczego?

plt.plot(x, y, label='Dane 1')
plt.title('Wykres')
plt.show()

4. Uzupełnij kod, aby powstał wykres słupkowy (pionowy). Jak zmienić go na poziomy?

kategorie = ['A', 'B', 'C']
wartosci = [10, 25, 15]
plt.______(kategorie, wartosci, color='skyblue')
plt.show()

5. Który parametr plt.pie() wyświetla wartości procentowe na wykresie?
a) labels b) autopct c) explode d) startangle

6. Jak będzie wyglądał wynik tego kodu?

plt.plot([1, 2, 3], [1, 4, 9], linestyle='--', marker='o')
plt.show()

7. W którym miejscu siatki pojawi się wykres? Jak nadać mu tytuł „Temperatura”?

fig, axes = plt.subplots(2, 2)
axes[0, 1].plot([1, 2, 3], [20, 22, 21])

8. Uzupełnij kod, aby narysować z DataFrame wykres liniowy sprzedaży:

df = pd.DataFrame({
    'Miesiąc': ['Sty', 'Lut', 'Mar'],
    'Sprzedaż': [120, 150, 180]
})
df.plot(x='Miesiąc', y='Sprzedaż', kind='______')
plt.show()

9. Który zapis zapisze wykres do pliku PNG w wysokiej rozdzielczości?
a) plt.save('w.png')
b) plt.savefig('w.png', dpi=300)
c) plt.show('w.png')
d) plt.export('w.png', dpi=300)

10. Uzupełnij kod tak, aby heatmapa pokazywała korelacje i wartości w komórkach:

korelacja = df.______()
sns.heatmap(korelacja, ______=True, cmap='coolwarm')
plt.show()

11. Napisz program, który narysuje wykres liniowy temperatur:

dni = ['Pn', 'Wt', 'Śr', 'Cz', 'Pt']
temp = [12, 15, 11, 14, 18]

Wymagania: czerwona linia z markerami w kształcie kółek, tytuł, opisy obu osi, siatka.

Odpowiedzi

1. a) pie, b) hist, c) scatter, d) bar.

2. Wystąpi ValueError. Listy x (3 elementy) i y (2 elementy) mają różną długość, więc wykres nie powstanie.

3. Brakuje wywołania plt.legend(). Samo label tylko nazywa linię, a legenda jest wyświetlana dopiero po plt.legend().

4. plt.bar(...). Wykres poziomy: plt.barh(...).

5. b) autopct (np. autopct='%1.1f%%'). explode wysuwa kawałek, startangle ustawia kąt początkowy, labels opisuje kawałki.

6. Przerywana linia (--) łącząca trzy punkty (1,1), (2,4), (3,9), każdy oznaczony kółkiem.

7. W pierwszym wierszu, w drugiej kolumnie (prawy górny róg siatki 2×2). Tytuł: axes[0, 1].set_title('Temperatura').

8. kind='line'.

9. b) plt.savefig('w.png', dpi=300).

10. df.corr() oraz annot=True.

11. Przykładowe rozwiązanie:

import matplotlib.pyplot as plt

dni = ['Pn', 'Wt', 'Śr', 'Cz', 'Pt']
temp = [12, 15, 11, 14, 18]

plt.plot(dni, temp, color='red', marker='o')
plt.title('Temperatura w tygodniu')
plt.xlabel('Dzień')
plt.ylabel('Temperatura (°C)')
plt.grid(True)
plt.show()

Sprawdzenie: czerwona linia z kółkami, tytuł, opisane osie i siatka, a na osi X dni od Pn do Pt.