import numpy as np
import matplotlib.pyplot as plt
= plt.subplots()
fig, ax1 = np.arange(0.01, 10.0, 0.01)
x = x ** 2
y 'r')
ax1.plot(x, y, = ax1.twinx()
ax2 = np.sin(x)
y2
ax2.plot(x, y2)
fig.tight_layout()=True) plt.show(block
37 Matplotlib - inne wykresy
37.1 Wykres dwuosiowy
Funkcja twinx
w bibliotece Matplotlib pozwala na utworzenie drugiej osi Y, która będzie współdzielić oś X z pierwszą osią Y. Dzięki temu, można w prosty sposób przedstawić dwie serie danych, które są mierzne w różnych jednostkach, ale mają wspólną zmienną niezależną.
Składnia funkcji to twinx(ax=None, **kwargs)
, gdzie:
ax
- obiekt Axes, który ma być użyty do tworzenia nowej osi Y. Domyślnie ustawione naNone
, co oznacza, że będzie tworzona nowa osie Y.**kwargs
- dodatkowe argumenty dotyczące formatowania nowej osi Y.
import numpy as np
import matplotlib.pyplot as plt
= plt.subplots()
fig, ax1 = np.arange(0.01, 10.0, 0.01)
t = np.exp(t)
s1 'b-')
ax1.plot(t, s1, 'time (s)')
ax1.set_xlabel(
'exp', color='b')
ax1.set_ylabel('y', colors='b')
ax1.tick_params(
= ax1.twinx()
ax2 = np.sin(2 * np.pi * t)
s2 'r.')
ax2.plot(t, s2, 'sin', color='r')
ax2.set_ylabel('y', colors='r')
ax2.tick_params(
fig.tight_layout()=True) plt.show(block
37.2 Wykres pudełkowy
Wykres pudełkowy (inaczej box plot) jest stosowany do przedstawiania informacji o rozkładzie danych liczbowych oraz do identyfikacji wartości odstających. Jest szczególnie przydatny w przypadku analizy danych ciągłych, które mają różne wartości i rozkłady. Oto kilka typów danych, dla których wykres pudełkowy może być stosowany:
Porównanie grup: Wykres pudełkowy jest używany do porównywania rozkładu danych między różnymi grupami. Na przykład, można go użyć do porównania wyników testów uczniów z różnych szkół, wynagrodzeń w różnych sektorach czy wartości sprzedaży różnych produktów.
Identyfikacja wartości odstających: Wykres pudełkowy jest używany do identyfikacji wartości odstających (outlierów) w danych, które mogą wskazywać na błędy pomiarowe, nietypowe obserwacje lub wartości ekstremalne. Na przykład, może to być użyte do wykrywania anomalii w danych meteorologicznych, wartościach giełdowych czy danych medycznych.
Analiza rozkładu: Wykres pudełkowy pomaga zrozumieć rozkład danych, takich jak mediana, kwartyle, zakres wartości i potencjalne wartości odstające. Może to być użyte w analizie danych takich jak oceny, wzrost ludności, wartość akcji czy ceny nieruchomości.
Wizualizacja wielowymiarowych danych: Wykres pudełkowy może być używany do wizualizacji wielowymiarowych danych, przedstawiając rozkład wielu zmiennych na jednym wykresie. Na przykład, można porównać zmienne takie jak wiek, zarobki i wykształcenie w badaniu demograficznym.
Warto zauważyć, że wykres pudełkowy jest szczególnie przydatny, gdy chcemy zrozumieć rozkład danych, ale nie pokazuje on konkretnej liczby obserwacji ani wartości indywidualnych punktów danych. W takich przypadkach inne rodzaje wykresów, takie jak wykres punktowy, mogą być bardziej odpowiednie.
Wykres pudełkowy pokazuje pięć statystyk opisowych danych: minimum, pierwszy kwartyl (Q1), medianę, trzeci kwartyl (Q3) i maksimum.
import matplotlib.pyplot as plt
import numpy as np
# Przykładowe dane
= np.random.rand(100)
data
# Tworzenie wykresu
= plt.subplots()
fig, ax
# Rysowanie boxplota
ax.boxplot(data)
# Dodanie opisów
'Boxplot')
ax.set_title('Wartości')
ax.set_ylabel('Przykładowe dane'])
ax.set_xticklabels([
# Wyświetlanie wykresu
=True) plt.show(block
import matplotlib.pyplot as plt
import numpy as np
# Creating dataset
10)
np.random.seed(= np.random.normal(100, 20, 200)
data
# Creating plot
plt.boxplot(data)
# show plot
=True) plt.show(block
patch_artist=True, # kolorowe pudełka
– włącza użycie obiektów typu „Patch” do rysowania samych pudełek, dzięki czemu możemy je wypełnić kolorem (sterowanym dalej przez boxprops
).
notch=True, # wcięcia przy medianie
– rysuje wcięcie („notch”) wokół linii mediany, co pomaga wizualnie ocenić istotność różnic między mediami.
boxprops=dict(facecolor='lightblue', edgecolor='navy'),
– stylowanie samych pudełek:
facecolor='lightblue'
– wypełnienie pudełka jasnoniebieskim kolorem,edgecolor='navy'
– obramowanie pudełka ciemnogranatowym.
medianprops=dict(color='darkred'),
– właściwości linii mediany: jedynie kolor ciemnoczerwony (darkred
).
whiskerprops=dict(color='navy'),
– styl wąsów (ang. whiskers): kolor „navy” dla linii, które łączą pudełko z końcami zakresu danych (bez uwzględniania odstających).
capprops=dict(color='navy'),
– styl „czapeczek” (caps) na końcach wąsów: również granatowy kolor.
flierprops=dict(
– styl punktów odstających („fliers”, wartości poza zasięgiem whiskers):
* `marker='o'` – kółko jako znacznik,
* `markerfacecolor='gray'` – szare wypełnienie kółka,
* `markersize=5` – rozmiar znacznika,
* `linestyle='none'` – bez linii łączącej te punkty.
import pandas as pd
import matplotlib.pyplot as plt
# Przygotowanie danych
= pd.DataFrame({
dane 'Środek transportu': [
'Samochód', 'Samochód', 'Samochód', 'Samochód', 'Samochód',
'Rower', 'Rower', 'Rower', 'Rower', 'Rower',
'Komunikacja miejska', 'Komunikacja miejska', 'Komunikacja miejska', 'Komunikacja miejska', 'Komunikacja miejska'
],'Czas dojazdu (minuty)': [
25, 30, 28, 55, 32,
20, 18, 22, 19, 21,
40, 45, 42, 38, 44
]
})
# Przygotowanie danych do wykresu pudełkowego
= dane['Środek transportu'].unique()
grupy = [dane.loc[dane['Środek transportu'] == s, 'Czas dojazdu (minuty)']
lista_czasow for s in grupy]
# Rysowanie wykresu
=(8, 6))
plt.figure(figsize
plt.boxplot(
lista_czasow,=grupy,
tick_labels=True, # kolorowe pudełka
patch_artist=True, # wcięcia przy medianie
notch=dict(facecolor='lightblue', edgecolor='navy'),
boxprops=dict(color='darkred'),
medianprops=dict(color='navy'),
whiskerprops=dict(color='navy'),
capprops=dict(marker='o', markerfacecolor='gray', markersize=5, linestyle='none')
flierprops
)
# Opisy osi i tytuł
'Czas dojazdu [minuty]', fontsize=12)
plt.ylabel('Porównanie czasów dojazdu do pracy\nw zależności od środka transportu', fontsize=14)
plt.title(
# Siatka i estetyka
='y', linestyle='--', alpha=0.7)
plt.grid(axis
plt.tight_layout()
# Wyświetlenie
plt.show()
37.3 Histogram
Wykres histogramu jest stosowany do przedstawiania rozkładu danych liczbowych, zarówno ciągłych, jak i dyskretnych. Histogram pokazuje częstość występowania danych w określonych przedziałach (binach), co pozwala na analizę dystrybucji i identyfikację wzorców. Oto kilka typów danych, dla których histogram może być stosowany:
Analiza rozkładu: Histogram może być używany do analizy rozkładu danych, takich jak oceny, ceny, wartości akcji, wzrost ludności czy dane meteorologiczne. Pozwala to zrozumieć, jak dane są rozłożone, czy są skoncentrowane wokół pewnych wartości, czy mają długi ogon (tj. czy występują wartości odstające).
Identyfikacja tendencji: Histogram może pomóc w identyfikacji tendencji lub wzorców w danych. Na przykład, można użyć histogramu do identyfikacji sezonowych wzorców sprzedaży, zmian w wartościach giełdowych czy wzorców migracji ludności.
Porównanie grup: Histogram może być również używany do porównywania rozkładu danych między różnymi grupami. Na przykład, można go użyć do porównania wyników testów uczniów z różnych szkół, wynagrodzeń w różnych sektorach czy wartości sprzedaży różnych produktów.
Szacowanie parametrów: Histogram może pomóc w szacowaniu parametrów rozkładu, takich jak średnia, mediana czy wariancja, co może być użyteczne w analizie statystycznej.
Warto zauważyć, że histogram jest odpowiedni dla danych liczbowych, ale nie jest przeznaczony do przedstawiania danych kategorialnych. W takich przypadkach inne rodzaje wykresów, takie jak wykres słupkowy, mogą być bardziej odpowiednie.
import matplotlib.pyplot as plt
= [1, 1, 2, 3, 3, 5, 7, 8, 9, 10,
x 10, 11, 11, 13, 13, 15, 16, 17, 18, 18]
=4)
plt.hist(x, bins=True) plt.show(block
import pandas as pd
import matplotlib.pyplot as plt
= [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
ages = [18, 25, 35, 60, 100]
bins = pd.cut(ages, [18, 26, 36, 61, 100], right=False)
cats2 print(cats2)
= ['Youth', 'YoungAdult',
group_names 'MiddleAged', 'Senior']
= pd.cut(ages, bins, labels=group_names)
data
plt.hist(data)=True) plt.show(block
[[18, 26), [18, 26), [18, 26), [26, 36), [18, 26), ..., [26, 36), [61, 100), [36, 61), [36, 61), [26, 36)]
Length: 12
Categories (4, interval[int64, left]): [[18, 26) < [26, 36) < [36, 61) < [61, 100)]
import matplotlib.pyplot as plt
= [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
ages = [18, 25, 35, 60, 100]
bins =bins)
plt.hist(ages, bins=True) plt.show(block
import matplotlib.pyplot as plt
= [1, 1, 2, 3, 3, 5, 7, 8, 9, 10,
x 10, 11, 11, 13, 13, 15, 14, 12, 18, 18]
=[0, 5, 10, 15, 20])
plt.hist(x, bins0, 5, 10, 15, 20])
plt.xticks([=True) plt.show(block
import matplotlib.pyplot as plt
= [1, 1, 2, 3, 3, 5, 7, 8, 9, 10,
x 10, 11, 11, 13, 13, 15, 14, 12, 18, 18]
=[0, 5, 10, 15, 20], cumulative=True)
plt.hist(x, bins0, 5, 10, 15, 20])
plt.xticks([=True) plt.show(block
import matplotlib.pyplot as plt
= [1, 1, 2, 3, 3, 5, 7, 8, 9, 10,
x 10, 11, 11, 13, 13, 15, 14, 12, 18, 18]
=[0, 5, 10, 15, 20], density=True)
plt.hist(x, bins0, 5, 10, 15, 20])
plt.xticks([=True) plt.show(block
import pandas as pd
import matplotlib.pyplot as plt
# 1. Tworzymy ramkę danych
= pd.DataFrame({
dane 'Dzień': list(range(1, 17)),
'Czas dojazdu (min)': [25, 30, 20, 35, 40, 22, 28, 33,
27, 32, 29, 31, 26, 24, 34, 36]
})
# 2. Rysujemy histogram
=(8, 6))
plt.figure(figsize
plt.hist('Czas dojazdu (min)'],
dane[=8, # liczba słupków
bins='black', # obramowanie słupków
edgecolor=0.7 # przezroczystość dla lepszej estetyki
alpha
)
# 3. Oznaczenia i estetyka
'Histogram czasu dojazdu do pracy')
plt.title('Czas dojazdu (minuty)')
plt.xlabel('Liczba dni')
plt.ylabel(range(20, 45, 5)) # dostosowane podziałki na osi X
plt.xticks(='y', alpha=0.75)
plt.grid(axis
plt.tight_layout() plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# 1. Ramka danych
= pd.DataFrame({
dane 'Dzień': list(range(1, 15)),
'Ilość kaw dziennie': [1, 2, 3, 3, 2, 4, 5, 3, 2, 1, 4, 3, 2, 3]
})
# 2. Rysujemy histogram z nowymi argumentami:
=(8, 6))
plt.figure(figsize
plt.hist('Ilość kaw dziennie'],
dane[=[0.5, 1.5, 2.5, 3.5, 4.5, 5.5], # precyzyjne przedziały wokół wartości 1–5
bins='lightblue', # kolor słupka
color='black', # obramowanie każdego słupka
edgecolor=0.7 # przezroczystość
alpha
)
# 3. Podpisy i estetyka
'Histogram: liczba kaw wypitych dziennie')
plt.title('Ilość kaw')
plt.xlabel('Liczba dni')
plt.ylabel(range(1, 6)) # od 1 do 5 kaw
plt.xticks(='y', linestyle='--', alpha=0.7)
plt.grid(axis
plt.tight_layout() plt.show()
37.4 Wykresy w przestrzeni
37.4.1 Helisa
\[\begin{cases} x=a\cos (t) \\ y=a\sin(t) \\ z=at \end{cases}\]
import numpy as np
import matplotlib.pyplot as plt
= plt.figure()
fig = plt.axes(projection='3d')
ax = np.linspace(0, 15, 1000)
t = 3
a = a * np.sin(t)
xline = a * np.cos(t)
yline = a * t
zline
ax.plot3D(xline, yline, zline)=True) plt.show(block
37.4.2 Torus
\[p(\alpha,\ \beta)=\Big((R+r\cos \alpha)\cos \beta,\ (R+r\cos \alpha)\sin \beta,\ r\sin \alpha\Big)\]
import numpy as np
import matplotlib.pyplot as plt
= plt.figure()
fig = plt.axes(projection='3d')
ax = 1
r = 5
R = np.arange(0, 2 * np.pi, 0.1)
alpha = np.arange(0, 2 * np.pi, 0.1)
beta = np.meshgrid(alpha, beta)
alpha, beta = (R + r * np.cos(alpha)) * np.cos(beta)
x = (R + r * np.cos(alpha)) * np.sin(beta)
y = r * np.sin(alpha)
z
ax.plot_wireframe(x, y, z)=True) plt.show(block