Wróć do katalogu
Season 36 5 Odcinki 19 min 2026

Matplotlib

Wersja v3.10 — Edycja 2026. Kompleksowy kurs audio o Matplotlib, najpopularniejszej bibliotece do wizualizacji w języku Python. Poznaj główne założenia, cykl życia wykresu, zaawansowane układy, typy wykresów i przepływy pracy dla zaawansowanych użytkowników w wersji 3.10.

Wizualizacja danych Nauka o danych
Matplotlib
Teraz odtwarzane
Click play to start
0:00
0:00
1
Główne założenia: Figure, Axes i interfejsy
Witamy w Matplotlib. W tym odcinku definiujemy model mentalny leżący u podstaw najpopularniejszej biblioteki do wizualizacji w języku Python. Poznaj różnicę między Figure a Axes i dowiedz się, dlaczego jawny interfejs Object-Oriented to twoje najlepsze narzędzie.
3m 26s
2
Cykl życia wykresu
Odkryj, jak przekształcić surowe dane w sformatowany wykres z etykietami. Przechodzimy przez cykl życia prostego wykresu, pokazując dokładnie, jak dodawać etykiety, tytuły i niestandardowe formatowanie osi (tick formatters) za pomocą jawnego interfejsu.
3m 31s
3
Opanowanie układów: Subplots i mozaiki
Dowiedz się, jak zarządzać wieloma wykresami na jednym płótnie, aby się nie nakładały. Ten odcinek omawia plt.subplots, potęgę subplot_mosaic w tworzeniu układów semantycznych oraz wykorzystanie constrained layout do utrzymania porządku.
4m 26s
4
Więcej niż linie: Odkrywanie podstawowych typów wykresów
Wyjdź poza podstawowe linie i wykresy typu scatter plot. Omawiamy kategorie wykresów w Matplotlib, zestawiając wykresy rozkładów statystycznych z funkcjami dla danych siatkowych, takimi jak imshow i pcolormesh.
4m 30s
5
Przepływy pracy dla zaawansowanych: Style i rcParams
Błyskawicznie odmień wygląd swoich wykresów. W naszym ostatnim odcinku sprawdzamy, jak korzystać z predefiniowanych arkuszy stylów i dynamicznie dostosowywać ustawienia globalne za pomocą rcParams.
4m 03s

Odcinki

1

Główne założenia: Figure, Axes i interfejsy

3m 26s

Witamy w Matplotlib. W tym odcinku definiujemy model mentalny leżący u podstaw najpopularniejszej biblioteki do wizualizacji w języku Python. Poznaj różnicę między Figure a Axes i dowiedz się, dlaczego jawny interfejs Object-Oriented to twoje najlepsze narzędzie.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Matplotlib, odcinek 1 z 5. Kopiujesz gotowe rozwiązanie ze Stack Overflow, wklejasz je do swojego kodu, a nagle twój nowy wykres nadpisuje stary. Kod wygląda poprawnie, ale zachowuje się jak potwór Frankensteina. Dzieje się tak, ponieważ większość przykładów w sieci miesza dwa zupełnie różne sposoby korzystania z tej biblioteki, bez wyjaśnienia dlaczego. Aby to naprawić, musisz zrozumieć podstawową tożsamość: Figure, Axes i interfejsy. Matplotlib to fundament wizualizacji w Pythonie. Pandas, Seaborn i wiele innych bibliotek działa na jego bazie. Jednak programiści często potykają się o jego architekturę. Aby pisać czysty kod wizualizacji, musisz oddzielić kontener od zawartości. W Matplotlib oznacza to zrozumienie różnicy między obiektem Figure a Axes. Figure to twoje płótno. To kontener najwyższego poziomu, który przechowuje całe okno, tło i wszystkie elementy wewnątrz. Ale Figure nie rysuje danych. Do tego potrzebujesz obiektu Axes. Axes to właściwy wykres. To obszar, w którym żyją twoje linie, słupki i punkty. Figure może zawierać wiele obiektów Axes, na przykład jako siatkę czterech subplotów. Pamiętaj, że Axes to nie jest liczba mnoga od słowa Axis. Obiekt Axes zawiera dwa lub trzy pojedyncze obiekty Axis, które obsługują konkretne osie liczbowe i ticki. Podpinasz dane do obiektu Axes, a Axes jest podpięty do obiektu Figure. Kiedy już wiesz, czym są te obiekty, musisz zdecydować, jak wejść z nimi w interakcję. I tu zaczyna się zamieszanie. Matplotlib daje ci dwa różne sposoby na zbudowanie wykresu: interfejs implicit i interfejs explicit. Interfejs implicit opiera się na module o nazwie pyplot. Śledzi on stan twojego programu za kulisami. Kiedy wywołujesz funkcję rysującą bezpośrednio, Matplotlib zakłada, że chcesz rysować po aktualnie aktywnym obiekcie Figure i Axes. Jeśli nie istnieją, tworzy je za ciebie. Jest to bardzo wygodne w przypadku szybkiego, jednorazowego skryptu, gdzie musisz po prostu szybko podejrzeć jakieś dane. Ale ponieważ polega na ukrytym stanie globalnym, staje się to nieprzewidywalne w większych aplikacjach. Interfejs explicit, często nazywany interfejsem obiektowym, eliminuje zgadywanie. Tworzysz instancje swoich obiektów z góry. Najpierw tworzysz razem obiekty Figure i Axes, a następnie wywołujesz metody bezpośrednio na tych konkretnych obiektach. Nigdy nie polegasz na tym, że biblioteka zgadnie, w który wykres celujesz. Jeśli budujesz reużywalny dashboard, zawsze używaj interfejsu explicit. Możesz pisać funkcje pomocnicze, które przyjmują obiekt Axes jako argument, rysują na nim dane i go zwracają. Funkcja nie przejmuje się globalnym stanem aplikacji. Po prostu modyfikuje obiekt, który został jej przekazany. Dzięki temu twój kod jest modułowy i testowalny. Oto kluczowy wniosek. Możesz używać obu tych metod, ale nigdy nie powinieneś ich mieszać. Używaj interfejsu implicit pyplot do szybkiej eksploracji w notebooku, a interfejsu explicit, czyli obiektowego, w kodzie produkcyjnym. Jeśli podoba ci się nasz podcast i chcesz nas wesprzeć, znajdziesz nas, wpisując DevStoriesEU na Patreon. To wszystko w tym odcinku. Dzięki za wysłuchanie i buduj dalej!
2

Cykl życia wykresu

3m 31s

Odkryj, jak przekształcić surowe dane w sformatowany wykres z etykietami. Przechodzimy przez cykl życia prostego wykresu, pokazując dokładnie, jak dodawać etykiety, tytuły i niestandardowe formatowanie osi (tick formatters) za pomocą jawnego interfejsu.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Matplotlib, odcinek 2 z 5. Formatowanie liczb na osi może przypominać walkę zapaśniczą. Chcesz mieć czyste sto K ze znakiem dolara, a na ekranie tłoczy się notacja naukowa albo surowe liczby całkowite. Rozwiązanie jest niezwykle proste, gdy nauczysz się, jak przekazać kontrolę nad osią bezpośrednio do standardowej funkcji w Pythonie. Dzisiaj przyjrzymy się cyklowi życia wykresu, używając explicit axes interface. Explicit interface traktuje tworzenie wykresów jako przewidywalny proces krok po kroku. Zawsze wywołujesz metody na konkretnym obiekcie. Cykl życia zaczyna się od utworzenia obiektu figure i obiektu axes. Figure to twoje puste płótno. Obiekt axes reprezentuje właściwy obszar, na którym znajdą się twoje dane. Kiedy masz już ten obiekt axes, każda modyfikacja to po prostu kolejne wywołanie na nim metody. Wyobraź sobie scenariusz, w którym masz listę nazw firm i listę ich przychodów. Aby wrzucić te dane na ekran, wywołujesz metodę rysującą na obiekcie axes. Dla poziomego wykresu słupkowego wywołujesz bar h i przekazujesz nazwy oraz przychody. W tym momencie masz działający wykres, ale brakuje mu kontekstu. Kolejną fazą cyklu życia jest dodanie tego kontekstu. Popularnym podejściem jest ustawianie title, x label i y label osobno. Jednak obiekt axes ma zunifikowaną metodę set. Możesz wywołać set i przekazać keyword arguments dla title, x label i y label za jednym zamachem. Ta jedna linijka kodu obsługuje tekst strukturalny twojego wykresu. Jeśli kiedykolwiek będziesz musiał sprawdzić, co jest aktualnie zastosowane, możesz użyć odpowiednich metod get, takich jak get x tick labels, aby pobrać obecny stan przed jego zmianą. To prowadzi nas do najważniejszej części fine-tuningu: formatowania liczb na osi. Kiedy plotujesz przychody, duże liczby robią bałagan na osiach. Matplotlib może wyświetlić sto tysięcy ze wszystkimi zerami. A ty chcesz, żeby pokazywał sto K ze znakiem dolara. Oto kluczowa sprawa. Nie musisz przekopywać się przez niejasne ustawienia Matplotlib, żeby to naprawić. Po prostu piszesz zwykłą funkcję w Pythonie. Definiujesz funkcję, która przyjmuje dwa argumenty: wartość ticka i jego pozycję. Wewnątrz tej funkcji piszesz standardową logikę w Pythonie. Sprawdzasz, czy wartość jest w tysiącach, dzielisz ją przez tysiąc i zwracasz sformatowany string ze znakiem dolara i wielką literą K. Aby to zastosować, mówisz obiektowi axes, żeby użył twojej funkcji dla swoich ticków. Odwołujesz się do właściwości x-axis w twoim obiekcie axes, a następnie wywołujesz metodę o nazwie set major formatter. Przekazujesz swoją customową funkcję bezpośrednio do tej metody. Od tego momentu Matplotlib przejmuje stery. Podczas rysowania wykresu, przepuszcza każdą pojedynczą wartość ticka na x-axis przez twoją funkcję w Pythonie i wyświetla czysty string, który zwróciłeś. Explicit interface eliminuje zgadywanie podczas customizacji wykresów, rozbijając ją na niezawodną sekwencję: tworzysz obiekt axes, mapujesz surowe dane, aplikujesz labele za pomocą pojedynczej metody set i całkowicie przechwytujesz formatowanie ticków za pomocą własnej logiki. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
3

Opanowanie układów: Subplots i mozaiki

4m 26s

Dowiedz się, jak zarządzać wieloma wykresami na jednym płótnie, aby się nie nakładały. Ten odcinek omawia plt.subplots, potęgę subplot_mosaic w tworzeniu układów semantycznych oraz wykorzystanie constrained layout do utrzymania porządku.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Matplotlib, odcinek 3 z 5. Musisz zbudować dashboard z szerokim wykresem w nagłówku i dwoma mniejszymi wykresami poniżej. Kiedyś oznaczało to obliczanie ułamków siatki i ręczne rozmieszczanie osi. Teraz możesz zbudować dokładnie taki layout, wpisując string w formie ASCII art. To jest Mastering Layouts: Subplots and Mosaics. Większość wizualizacji danych zaczyna się od prostej siatki. Kiedy potrzebujesz layoutu dwa na dwa, wywołujesz standardową funkcję subplots, podajesz liczbę wierszy i kolumn, a Matplotlib zwraca ci obiekt figure i wielowymiarową tablicę zawierającą twoje pojedyncze osie. Używasz standardowego indeksowania tablicy, żeby wybrać konkretną oś i narysować swoje dane. Działa to idealnie, dopóki nie dodasz tekstu. Domyślnie Matplotlib pozycjonuje osie na podstawie stałych proporcji rozmiaru figure. Nie bierze pod uwagę fizycznej przestrzeni zajmowanej przez twoje tytuły, etykiety osi czy znaczniki. W rezultacie etykiety osi X z górnego wiersza będą często nachodzić na tytuły z dolnego wiersza. Zamiast pisać własne poprawki odstępów, powinieneś zająć się tym na etapie tworzenia figure. Przekaż argument layout ustawiony na słowo constrained. Constrained layout to silnik optymalizacyjny. Tuż przed narysowaniem figure, mierzy on bounding boxy wszystkich twoich elementów tekstowych i rozsuwa osie dokładnie na tyle, żeby zapobiec kolizjom. Standardowe subplots i constrained layouts sprawdzają się przy symetrycznych siatkach. Ale dashboardy rzadko są symetryczne. Często potrzebujesz wykresów, które rozciągają się na wiele wierszy lub kolumn. To sprowadza nas z powrotem do szerokiego wykresu w nagłówku, zajmującego cały górny wiersz, z dwoma mniejszymi wykresami obok siebie poniżej. Zamiast zajmować się niskopoziomowymi obiektami specyfikacji siatki, możesz użyć semantycznej metody o nazwie subplot mosaic. Wywołujesz subplot mosaic bezpośrednio na swoim obiekcie figure. Przyjmuje ona wizualną reprezentację twojego layoutu, zapisaną w całości za pomocą stringów. Każdy unikalny znak, który wpiszesz, reprezentuje osobny wykres. Jeśli znak powtarza się w wierszach lub kolumnach, ten wykres rozciąga się, żeby wypełnić te przestrzenie. Żeby zbudować layout naszego dashboardu, możesz przekazać pojedynczy string, w którym wiersze są oddzielone średnikami. Dla górnego wiersza wpisujesz dwukrotnie wielką literę A. Potem średnik. Dla dolnego wiersza wpisujesz wielką literę B, a następnie wielką literę C. Cały string to po prostu A A średnik B C. Matplotlib parsuje ten string i widzi, że A zajmuje dwie kolumny w pierwszym wierszu, więc tworzy jedną szeroką oś na samej górze. Widzi, że B i C zajmują po jednej kolumnie w drugim wierszu, więc tworzy dwie mniejsze osie poniżej. A oto kluczowa sprawa. Ponieważ standardowe tablice tracą znaczenie w złożonych layoutach, subplot mosaic nie zwraca tablicy. Zwraca standardowy słownik Pythona. Kluczami tego słownika są dokładnie te same znaki ze stringa, które zmapowałeś w swoim projekcie. Jeśli chcesz narysować wykres liniowy w swoim szerokim nagłówku, po prostu odwołujesz się do słownika za pomocą klucza A. Jeśli chcesz umieścić scatter plot w prawym dolnym rogu, odwołujesz się do słownika za pomocą klucza C. Twój kod rysujący staje się całkowicie odcięty od współrzędnych siatki. Możesz też użyć tego systemu do celowego tworzenia white space. Jeśli chcesz mieć pustą lukę w siatce, wstawiasz znak kropki w swoim stringu layoutu. Matplotlib odczytuje kropkę i zostawia tę konkretną komórkę siatki całkowicie pustą. Skomplikowana matematyka siatki to już przeszłość. Nowoczesne projektowanie layoutu to po prostu wpisanie wizualnego kształtu, który chcesz uzyskać, i pozwolenie, żeby słownik zmapował twoje dane w dokładnie odpowiednie miejsce na ekranie. To wszystko w tym odcinku. Dzięki za wysłuchanie i buduj dalej!
4

Więcej niż linie: Odkrywanie podstawowych typów wykresów

4m 30s

Wyjdź poza podstawowe linie i wykresy typu scatter plot. Omawiamy kategorie wykresów w Matplotlib, zestawiając wykresy rozkładów statystycznych z funkcjami dla danych siatkowych, takimi jak imshow i pcolormesh.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Matplotlib, odcinek 4 z 5. Masz dziesięć tysięcy punktów danych, wrzucasz je na scatter plot i kończysz z gigantyczną, nieczytelną plamą atramentu, gdzie nakładające się punkty zasłaniają rzeczywisty wzór. Wybrałeś narzędzie typu pairwise do problemu gęstości. Wyjście poza domyślny line chart wymaga wiedzy, jak dopasować kształt danych do odpowiedniego narzędzia wizualnego, i to właśnie omawiamy w odcinku Beyond the Line: Exploring Core Plot Types. Matplotlib dzieli swoje główne typy wykresów na szerokie kategorie w oparciu o strukturę twoich danych. Trzy podstawowe kategorie to dane typu pairwise, rozkłady statystyczne i dane na siatce. Najbardziej podstawowy kształt to pairwise. Masz array wartości X i pasujący do niego array wartości Y. Używasz funkcji plot, gdy te punkty mają logiczną sekwencję, jak szereg czasowy, gdzie narysowanie ciągłej linii między nimi pokazuje trend. Jeśli punkty są niezależnymi obserwacjami, używasz funkcji scatter, aby umieścić pojedyncze markery. Ale scatter ploty zawodzą przy dużej gęstości. To prowadzi nas do drugiej kategorii, która obsługuje rozkłady statystyczne. Oto kluczowa kwestia. Kiedy masz dziesięć tysięcy nakładających się na siebie punktów, tak naprawdę nie obchodzi cię dokładna współrzędna punktu numer cztery tysiące. Interesuje cię to, gdzie te punkty się skupiają. I tutaj wkracza funkcja taka jak hexbin. Przyjmuje ona te same arraye X i Y co scatter plot, ale grupuje obszar geometryczny w heksagonalne biny, kolorując je na podstawie gęstości punktów, aby ujawnić ukryty wzór. Weźmy teraz pod uwagę pojedynczy array zawierający surowy wiek wszystkich twoich klientów. Rysowanie ich jeden po drugim jako kropek daje ci tylko bezużyteczny szum. Zamiast tego, wrzucasz tę pojedynczą, płaską listę do funkcji hist. Histogram automatycznie grupuje poszczególne wartości wieku w zakresy i pokazuje ci liczbę klientów po dwudziestce w porównaniu do tych po pięćdziesiątce. Jeśli musisz porównać te rozkłady wieku w pięciu różnych lokalizacjach sklepów obok siebie, przełączasz się na boxplot. Boxplot w przejrzysty sposób podsumowuje zakresy, mediany i wartości odstające. Jeśli potrzebujesz więcej szczegółów niż zapewnia boxplot, violinplot narysuje pełny, zakrzywiony kształt profilu gęstości dla każdego sklepu. Trzecia główna kategoria to dane na siatce. Ma to zastosowanie, gdy twoje dane są dwuwymiarową macierzą i musisz zwizualizować ciągłą wartość na danym obszarze. Pomyśl o dwuwymiarowej mapie temperatur na siatce geograficznej. Każda pozycja ma współrzędną X, współrzędną Y i wartość temperatury. Nie chcesz, żeby reprezentowały to linie albo rozrzucone punkty. Chcesz mieć jednolitą, kolorową powierzchnię. Matplotlib udostępnia w tym celu funkcje imshow i pcolormesh. Używasz imshow, gdy twoje dane leżą na idealnie regularnej siatce, jak piksele na cyfrowym zdjęciu. Zakłada ona równe odstępy między każdym punktem danych i renderuje się bardzo szybko. Jeśli współrzędne twojej siatki są nieregularne, na przykład twoje granice pomiarowe zniekształcają się lub kompresują w pobliżu pewnych obiektów geograficznych, używasz pcolormesh. Oblicza ona i rysuje pojedyncze czworokąty dla każdej pojedynczej komórki, dokładnie dopasowując się do zniekształconego kształtu twoich arrayów współrzędnych. Decydując, którą funkcję Matplotlib wywołać, zignoruj to, jak chcesz, żeby wyglądał końcowy obrazek, i spójrz ściśle na matematyczny kształt twoich wejściowych arrayów: czy są to sekwencyjne pary, płaskie listy, czy dwuwymiarowe macierze. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
5

Przepływy pracy dla zaawansowanych: Style i rcParams

4m 03s

Błyskawicznie odmień wygląd swoich wykresów. W naszym ostatnim odcinku sprawdzamy, jak korzystać z predefiniowanych arkuszy stylów i dynamicznie dostosowywać ustawienia globalne za pomocą rcParams.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Matplotlib, odcinek 5 z 5. Często widzisz, jak ludzie piszą dwadzieścia linijek powtarzalnego kodu, żeby dostosować tick labels, grid lines i fonty dla każdego pojedynczego wykresu, który tworzą. Jedna komenda może natychmiast zastosować wszystkie te zmiany w całym projekcie. W tym odcinku omówimy workflow dla power userów: style i rcParams. Standardowy wygląd Matplotliba jest bardzo rozpoznawalny, ale ręczne aktualizowanie poszczególnych elementów każdego wykresu, żeby dopasować je do konkretnej estetyki, jest mało wydajne. Zamiast tego używasz style sheets. Matplotlib ma wbudowanych kilka stylów. Wywołujesz funkcję o nazwie style dot use z modułu pyplot i przekazujesz string, na przykład ggplot albo classic. Jeśli przygotowujesz wizualizację na slajd prezentacji z ciemnym motywem, nie musisz ręcznie zmieniać tła na czarne, osi na białe, a tekstu na jasnoszary. Odpalasz style dot use z dark underscore background na samej górze swojego skryptu. Każda figura wygenerowana po tej linijce natychmiast dziedziczy ten konkretny wygląd. Możesz nawet łączyć style sheets. Jeśli przekażesz listę nazw stylów, Matplotlib zastosuje je w kolejności od lewej do prawej. Style wymienione po prawej stronie nadpiszą pokrywające się ustawienia ze stylów po lewej. A oto kluczowa sprawa. Wywołanie style dot use zmienia global state na resztę twojej sesji w Pythonie. Jeśli chcesz użyć konkretnego stylu tylko dla jednego wykresu, używasz context managera o nazwie style dot context. Otwierasz kontekst, podajesz nazwę stylu i piszesz swój kod rysujący wewnątrz tego bloku. Kiedy blok się kończy, twoje wykresy wracają do globalnego stylu, który był aktywny wcześniej. Pod tymi style sheets kryje się potężny słownik konfiguracyjny o nazwie rcParams. Litery r i c oznaczają runtime configuration. Każda domyślna właściwość, której Matplotlib używa do renderowania figury, znajduje się w tym słowniku. Rozmiary fontów, grubości linii, domyślne wymiary figur i style markerów są zmapowane na konkretne klucze typu string. Kiedy aplikujesz style sheet, tak naprawdę masowo aktualizujesz słownik rcParams w tle. Ale możesz też wejść z nim w bezpośrednią interakcję, żeby wprowadzać precyzyjne, dynamiczne zmiany. Powiedzmy, że zaaplikowałeś styl, który ci się podoba, ale domyślna grubość linii jest dla ciebie zbyt cienka. Odwołujesz się do słownika rcParams, podajesz klucz lines dot linewidth i przypisujesz mu nową wartość liczbową. Od tego momentu każda linia narysowana w twojej sesji domyślnie przyjmie tę większą grubość. Matplotlib dostarcza też funkcję pomocniczą o nazwie rc, żeby to ułatwić. Zamiast modyfikować słownik klucz po kluczu, wywołujesz rc, przekazujesz nazwę grupy najwyższego poziomu, na przykład font, a następnie podajesz keyword arguments dla konkretnych właściwości, takich jak weight albo size. To znacznie czystszy sposób na aktualizację kilku powiązanych ustawień naraz. Możesz też definiować własne style. Style sheet to po prostu plik tekstowy z rozszerzeniem dot mplstyle. W środku zawiera prostą listę par key-value dla rcParams. Zapisujesz ten plik, przekazujesz jego ścieżkę do style dot use, a twój firmowy branding jest natychmiast aplikowany do każdego wykresu, bez zaśmiecania twojego kodu od danych. Prawdziwa siła customizacji w Matplotlibie to oddzielenie logiki danych od wyborów estetycznych. Globalne ustawienie reguł sprawia, że twoje funkcje rysujące pozostają zwięzłe i zapewnia spójność wizualną w całym twoim codebase. Zachęcam cię do przejrzenia oficjalnej dokumentacji, żeby zobaczyć pełną listę dostępnych runtime configurations i spróbować samodzielnie zbudować własny style sheet, albo do odwiedzenia devstories dot eu, żeby zasugerować tematy do przyszłych serii. Dzięki za spędzenie ze mną tych kilku minut. Do usłyszenia następnym razem, trzymaj się.