{"id":29161,"date":"2023-05-16T07:08:54","date_gmt":"2023-05-16T05:08:54","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/biblioteka-matplotlib\/"},"modified":"2024-10-29T15:33:20","modified_gmt":"2024-10-29T14:33:20","slug":"biblioteka-matplotlib","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteka-matplotlib\/","title":{"rendered":"Obliczenia naukowe w\u202fj\u0119zyku Python \u2013 wprowadzenie do biblioteki Matplotlib\u202f"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\"><\/p>\n    <ol>\n                    <li><a href=\"#Analiza-danych-a-odpowiednia-biblioteka-w-j\u0119zyku-Python\">1.  Analiza danych a odpowiednia biblioteka w j\u0119zyku Python <\/a><\/li>\n                    <li><a href=\"#Instalacja\">2.  Instalacja<\/a><\/li>\n                    <li><a href=\"#wykres\u00f3w\">3.  Podstawy tworzenia i om\u00f3wienie struktury wykres\u00f3w <\/a><\/li>\n                    <li><a href=\"#wykres\u00f3w-w-Matplotlib\">4.  Popularne rodzaje wykres\u00f3w w Matplotlib <\/a><\/li>\n                    <li><a href=\"#Dostosowanie-wykresu\">5.  Dostosowanie wykresu <\/a><\/li>\n                    <li><a href=\"#Wykresy-wieloosiowe\">6.  Wykresy wieloosiowe <\/a><\/li>\n                    <li><a href=\"#Podsumowanie-i-cheat-sheet\">7.  Podsumowanie i cheat sheet <\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Analiza-danych-a-odpowiednia-biblioteka-w-j\u0119zyku-Python\">Analiza danych a odpowiednia biblioteka w j\u0119zyku Python<\/h2>\n\n\n\n<p>Je\u017celi kiedykolwiek zdarzy\u0142o ci si\u0119 wykonywa\u0107 <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/wizualizacja-danych\/\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/wizualizacja-danych\/\">analiz\u0119 danych<\/a>, to wiesz, jak wa\u017cne jest przedstawienie wynik\u00f3w pracy w spos\u00f3b szybki i czytelny. Mo\u017cesz \u0142atwo zobrazowa\u0107 pewne wzorce, anomalie i trendy, kt\u00f3re s\u0105 wynikiem twojej pracy. Jest to szczeg\u00f3lnie przydatne w przygotowaniu prezentacji lub raport\u00f3w biznesowych dla os\u00f3b nietechnicznych. Wizualizacja wynik\u00f3w pozwala na \u0142atwiejsze przedstawienie obserwacji, a korzystaj\u0105c z narz\u0119dzi dostarczonych przez bibliotek\u0119 Matplotlib, masz pewno\u015b\u0107, \u017ce ca\u0142y proces jest wydajny, prosty i elastyczny. Za pomoc\u0105 kilku linijek kodu otrzymujesz dost\u0119p do podstawowych i zaawansowanych funkcji, kt\u00f3re s\u0105 bezp\u0142atne, bo Matplotlib jest bibliotek\u0105 open-source.<\/p>\n\n\n\n<p>Szczeg\u00f3lnie wydajne jest po\u0142\u0105czenie mo\u017cliwo\u015bci tej biblioteki z innymi bibliotekami naukowymi, takimi jak <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/numpy-wstep-do-biblioteki-python\/\" target=\"_blank\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/numpy-wstep-do-biblioteki-python\/\" rel=\"noreferrer noopener\"><strong>NumPy<\/strong><\/a>, <strong><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteki-python-pandas\/\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteki-python-pandas\/\">Pandas<\/a> <\/strong>czy <strong>SciPy<\/strong>.<\/p>\n\n\n\n<p>Zak\u0142adam, \u017ce znasz podstawy j\u0119zyka Python. Je\u017celi nie, to nie przejmuj si\u0119, poniewa\u017c kod, kt\u00f3ry tutaj przedstawiam, mo\u017cesz \u0142atwo zrozumie\u0107 i uruchomi\u0107 po przej\u015bciu jednego z kurs\u00f3w programowania w j\u0119zyku Python dost\u0119pnych w sieci. Podstawowa sk\u0142adnia wystarczy ci do skorzystania z tego artyku\u0142u. Przejd\u017amy wi\u0119c do instalacji i konfiguracji \u015brodowiska.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Instalacja\">Instalacja biblioteki Matplotlib<\/h2>\n\n\n\n<p>Na komputerze powinien znajdowa\u0107 si\u0119 zainstalowany Python w wersji <strong>3.x.<\/strong><\/p>\n\n\n\n<p>Bibliotek\u0119 Matplotlib mo\u017cesz zainstalowa\u0107 za pomoc\u0105 mened\u017cera pakiet\u00f3w \u2018pip\u2019. Otw\u00f3rz terminal lub wiersz polece\u0144 (lub PowerShell) dla systemu Windows i wpisz komend\u0119:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install matplotlib<\/pre>\n\n\n\n<p>Je\u017celi korzystasz z Pythona <strong>2.x<\/strong> to skorzystaj z komendy \u2018pip2\u2019.<\/p>\n\n\n\n<p>Niekt\u00f3rzy u\u017cytkownicy u\u017cywaj\u0105 narz\u0119dzia <strong>Anaconda <\/strong>lub <strong>Miniconda<\/strong>. W tym przypadku skorzystaj z menad\u017cera pakiet\u00f3w \u2018conda\u2019:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">conda install matplotlib<\/pre>\n\n\n\n<p>W przypadku poprawnego zako\u0144czenia procesu instalacji mo\u017cemy zaimportowa\u0107 bibliotek\u0119 do naszego projektu. Zazwyczaj importuje si\u0119 g\u0142\u00f3wny modu\u0142 tej biblioteki, czyli \u2018pyplot\u2019. Zawiera on niezb\u0119dne funkcje do generowania wykres\u00f3w.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import matplotlib.pyplot as plt<\/pre>\n\n\n\n<p>Sama biblioteka korzysta z domy\u015blnych styl\u00f3w podczas \u201eupi\u0119kszania\u201d i modyfikacji wykres\u00f3w. S\u0105 to np. modyfikacje kolorystyczne, czcionki, dodawanie dodatkowych informacji, legend itd. Je\u017celi chcesz zapozna\u0107 si\u0119 z r\u00f3\u017cnymi stylami, kt\u00f3re oferuje Matplotlib, to zajrzyj do <a href=\"https:\/\/matplotlib.org\/stable\/gallery\/style_sheets\/style_sheets_reference.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/matplotlib.org\/stable\/gallery\/style_sheets\/style_sheets_reference.html\" rel=\"noreferrer noopener\">dokumentacji <\/a>lub skorzystaj z komendy \u2018<strong>print<\/strong>\u2019:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">print(plt.style.available)<\/pre>\n\n\n\n<p>W celu u\u017cycia konkretnego stylu w twoim projekcie skorzystaj z funkcji:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">plt.style.use(\u2018nazwa_stylu\u2019) # np. \u2018seaborn\u2019<\/pre>\n\n\n\n<p>Konfiguracj\u0119 mo\u017cesz dostosowa\u0107 wed\u0142ug w\u0142asnych preferencji, modyfikuj\u0105c konkretne warto\u015bci parametr\u00f3w z u\u017cyciem funkcji:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">plt.rcParams.update({'font.size': 10, 'figure.figsize': (10, 8)})<\/pre>\n\n\n\n<p>W tym artykule b\u0119d\u0119 korzysta\u0142 z domy\u015blnego stylu, ale zach\u0119cam ci\u0119 do wybrania i dostosowania tego, kt\u00f3ry najbardziej ci odpowiada. Przejd\u017amy teraz do podstaw tworzenia wykres\u00f3w w <strong>Matplotlib<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wykres\u00f3w\">Podstawy tworzenia i om\u00f3wienie struktury wykres\u00f3w<\/h2>\n\n\n\n<p>Koncepcj\u0119 i struktur\u0119 wykresu w bibliotece Matplotlib najpro\u015bciej mo\u017cna wyja\u015bni\u0107 za pomoc\u0105 wykresu liniowego. Wykresy tworzone s\u0105 na podstawie tzw. Figur \u2018<strong>figure<\/strong>\u2019. Figura mo\u017ce zosta\u0107 opisana jako kontener na jedn\u0105 lub wi\u0119cej osi \u2018<strong>axes<\/strong>\u2019. Osiami okre\u015blamy powierzchni\u0119 wykresu, na kt\u00f3rej rysowane s\u0105 dane. Je\u017celi mowa o wykresie 2D, to zawiera\u0142 on b\u0119dzie osie X i Y, a np. wykres 3D X, Y i Z. Do danego wykresu przypisa\u0107 mo\u017cna r\u00f3wnie\u017c elementy opisuj\u0105ce. Mog\u0105 to by\u0107 etykiety osi, legendy, tytu\u0142y i warto\u015bci, np. nad s\u0142upkami.<\/p>\n\n\n\n<p>W celu utworzenia prostego wykresu liniowego skorzystamy ze wspomnianej wcze\u015bniej biblioteki <strong>NumPy <\/strong>(odsy\u0142am do mojego poprzedniego artyku\u0142u). Stworzymy list\u0119 zawieraj\u0105c\u0105 warto\u015bci liczbowe dla osi X oraz skorzystamy z warto\u015bci funkcji sinus dla osi Y.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np \n\nimport matplotlib.pyplot as plt \n\n# Przygotowanie danych \n\nx = np.linspace(0, 10, 100) \n\ny = np.sin(x) <\/pre>\n\n\n\n<p>W celu utworzenia wykresu liniowego o krzywej sinusoidalnej u\u017cyjemy funkcji \u2018plot()\u2019, a nast\u0119pnie wy\u015bwietlimy go za pomoc\u0105 funkcji \u2018show()\u2019. Je\u017celi uruchomisz poni\u017cszy kod, to powinien wy\u015bwietli\u0107 ci si\u0119 na ekranie wykres liniowy, kt\u00f3ry przedstawia funkcj\u0119 sinus.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">plt.plot(x, y)  # Rysowanie wykresu liniowego \n\nplt.show()  # Wy\u015bwietlenie wykresu <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"400\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_1.png\" alt=\"Rys. 1. Wykres liniowy przedstawiaj\u0105cy funkcj\u0119 sinus.\u00a0\" class=\"wp-image-32111\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_1.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_1-300x157.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_1-495x260.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 1. Wykres liniowy przedstawiaj\u0105cy funkcj\u0119 sinus.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Jak si\u0119 pewnie domy\u015blasz, wykres ten nie jest zbyt czytelny, poniewa\u017c poza warto\u015bciami same osie nie zosta\u0142y opisane, wykres nie posiada tytu\u0142u, a wi\u0119c nie jeste\u015bmy w stanie okre\u015bli\u0107, co on tak naprawd\u0119 przedstawia. Mo\u017cemy si\u0119 domy\u015bla\u0107, \u017ce chodzi o funkcj\u0119 sinus, ale lepiej poprawi\u0107 ten wykres, \u017ceby by\u0142 bardziej czytelny, szczeg\u00f3lnie dla osoby bez znajomo\u015bci wybranych zagadnie\u0144 matematycznych. Dodamy zatem tytu\u0142 wykresu \u2018<strong>title()<\/strong>\u2019, etykiety osi \u2018<strong>xlabel()<\/strong>\u2019, \u2018<strong>ylabel()<\/strong>\u2019 oraz legend\u0119.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">plt.plot(x, y, label='sin(x)')  # Dodanie etykiety dla serii danych (do legendy) \n\nplt.xlabel('X')  # Etykieta osi X \n\nplt.ylabel('Y')  # Etykieta osi Y \n\nplt.title('Wykres funkcji sinus')  # Tytu\u0142 wykresu \n\nplt.legend()  # Dodanie legendy \n\nplt.show()  # Wy\u015bwietlenie wykresu <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"400\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_2.png\" alt=\"oprawiony wykres funkcji sinus\" class=\"wp-image-32114\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_2.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_2-300x157.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_2-495x260.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 2. Poprawiony wykres funkcji sinus (dodano tytu\u0142, opisy osi oraz legend\u0119).<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Wiesz ju\u017c, jak stworzy\u0107 prosty wykres liniowy, ale co w przypadku gdy istnieje potrzeba prezentacji danych za pomoc\u0105 innych wykres\u00f3w? Zajmiemy si\u0119 nimi w dalszej cz\u0119\u015bci, gdzie om\u00f3wi\u0119 wybrane ich rodzaje.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wykres\u00f3w-w-Matplotlib\">Popularne rodzaje wykres\u00f3w w Matplotlib<\/h2>\n\n\n\n<p>Omawiana biblioteka pozwala na dostosowanie naszych wizualizacji do konkretnego przypadku, a przyk\u0142ady, kt\u00f3re podaj\u0119, to tylko niekt\u00f3re z oferowanych mo\u017cliwo\u015bci. Je\u017celi sp\u0119dzisz z t\u0105 bibliotek\u0105 wi\u0119cej czasu, to z pewno\u015bci\u0105 poznasz wiele wi\u0119cej funkcji i mo\u017cliwo\u015bci, a to prze\u0142o\u017cy si\u0119 na jeszcze lepsze przedstawianie danych i intuicyjne przekazywanie informacji.<\/p>\n\n\n\n<p>Poza wykresem liniowym popularne s\u0105 tak\u017ce:&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Wykresy punktowe (Scatter plot)<\/strong> \u2013 zbi\u00f3r punkt\u00f3w, kt\u00f3re nie s\u0105 ze sob\u0105 po\u0142\u0105czone. U\u017cywany w wizualizacji korelacji pomi\u0119dzy zmiennymi, rozk\u0142adu warto\u015bci albo okre\u015blania grup. Przyk\u0142adem zastosowania mo\u017ce by\u0107 analiza badania demograficznego pod k\u0105tem zale\u017cno\u015bci mi\u0119dzy wiekiem a zarobkami lub do\u015bwiadczeniem grupy badanej. Poni\u017cej znajduje si\u0119 fragment kodu, kt\u00f3ry pozwala utworzy\u0107 wykres punktowy.<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np \n\nimport matplotlib.pyplot as plt \n\n# Przyk\u0142adowe dane \n\nwiek = np.random.randint(18, 65, 100) \n\nzarobki = np.random.normal(50000, 10000, 100) + (wiek - 18) * 1000 \n\nplt.scatter(wiek, zarobki) \n\nplt.xlabel('Wiek') \n\nplt.title('Zwi\u0105zek mi\u0119dzy wiekiem a rocznymi zarobkami') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"449\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_3.png\" alt=\"Rys. 3. Przyk\u0142ad wykresu punktowego zale\u017cno\u015bci pomi\u0119dzy wiekiem, a zarobkami.\u00a0\" class=\"wp-image-32117\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_3.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_3-300x177.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_3-495x292.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 3. Przyk\u0142ad wykresu punktowego zale\u017cno\u015bci pomi\u0119dzy wiekiem, a zarobkami.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>2. <strong>Histogram<\/strong> \u2013 jest rodzajem wykresu s\u0142upkowego, kt\u00f3ry ilustruje rozk\u0142ad warto\u015bci danych. Wykorzystywany do wizualizacji cz\u0119stotliwo\u015bci wyst\u0119powania warto\u015bci w wybranym zbiorze danych. Prostym przyk\u0142adem mo\u017ce by\u0107 wizualizacja rozk\u0142adu ocen w grupie uczni\u00f3w. Poni\u017cej zamieszczam kod, za pomoc\u0105 kt\u00f3rego wygenerujesz histogram.&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">oceny = np.random.normal(3.5, 0.5, 200) \n\nplt.hist(oceny, bins=20, alpha=0.7, label='Oceny uczni\u00f3w') \n\nplt.xlabel('Ocena') \n\nplt.ylabel('Cz\u0119stotliwo\u015b\u0107') \n\nplt.title('Rozk\u0142ad ocen w grupie uczni\u00f3w') \n\nplt.legend() \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"398\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_4.png\" alt=\"Rys. 4. Przyk\u0142ad histogramu dla cz\u0119stotliwo\u015bci wyst\u0119powania wybranych danych.\u00a0\" class=\"wp-image-32120\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_4.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_4-300x157.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_4-495x259.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 4. Przyk\u0142ad histogramu dla cz\u0119stotliwo\u015bci wyst\u0119powania wybranych danych.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>3. <strong>Wykres s\u0142upkowy<\/strong> \u2013 jeden z najpopularniejszych wykres\u00f3w, kt\u00f3ry przedstawia dane za pomoc\u0105 poziomych lub pionowych s\u0142upk\u00f3w. Zazwyczaj u\u0142atwia por\u00f3wnanie danych, kt\u00f3re pogrupowano w konkretne kategorie. Przyk\u0142adem mo\u017ce by\u0107 por\u00f3wnanie \u015brednich wynik\u00f3w dru\u017cyn w lidze sportowej. Poni\u017cej zamieszczam kod i zrzut ekranu przyk\u0142adowego wykresu.&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">plt.bar(druzyny, srednie_wyniki, alpha=0.7) \n\nplt.xlabel('Dru\u017cyny') \n\nplt.ylabel('\u015aredni wynik') \n\nplt.title('Por\u00f3wnanie \u015brednich wynik\u00f3w dru\u017cyn w lidze sportowej') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"452\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_5.png\" alt=\"Rys. 5. Przyk\u0142ad wykresu s\u0142upkowego \u015bredniego wyniku dru\u017cyn w lidze sportowej.\u00a0\" class=\"wp-image-32123\" style=\"aspect-ratio:1.6855828220858895;width:1099px;height:auto\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_5.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_5-300x178.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_5-495x294.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 5. Przyk\u0142ad wykresu s\u0142upkowego \u015bredniego wyniku dru\u017cyn w lidze sportowej.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>4. <strong>Wykres ko\u0142owy<\/strong> \u2013 dane znajduj\u0105 si\u0119 w sektorach w obr\u0119bie ko\u0142a. Doskonale obrazuje proporcje poszczeg\u00f3lnych element\u00f3w lub grup wzgl\u0119dem ca\u0142o\u015bci. Przyk\u0142adem mo\u017ce by\u0107 wykres na podstawie analizy udzia\u0142u dostawc\u00f3w energii na rynku w Unii Europejskiej. Kod i wykres zosta\u0142y zamieszczone poni\u017cej.&nbsp;&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">firmy = ['Firma A', 'Firma B', 'Firma C', 'Firma D'] \n\nudzialy_rynku = [35, 25, 20, 20] \n\nplt.pie(udzialy_rynku, labels=firmy, autopct='%.1f%%', startangle=90) \n\nplt.axis('equal') \n\nplt.title('Struktura rynkowa w sektorze energetycznym') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"450\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_6.png\" alt=\"Rys. 6. Wykres ko\u0142owy obrazuj\u0105cy procentowy udzia\u0142 4 firm na rynku energii.\u00a0\" class=\"wp-image-32126\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_6.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_6-300x177.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_6-495x292.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 6. Wykres ko\u0142owy obrazuj\u0105cy procentowy udzia\u0142 4 firm na rynku energii.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>5. <strong>Mapa ciep\u0142a (heatmap)<\/strong> \u2013 nie jest typowym wykresem znanym np. ze szko\u0142y, poniewa\u017c wyst\u0119puje w postaci macierzy, na kt\u00f3rej kolory odpowiadaj\u0105 warto\u015bciom konkretnych kom\u00f3rek. Dobrze obrazuje korelacje i gradienty warto\u015bci oraz wykrywa wzorce w przypadku danych dwuwymiarowych. Przyk\u0142adem u\u017cycia mo\u017ce by\u0107 poziom ekspresji gen\u00f3w w zale\u017cno\u015bci od stworzonych warunk\u00f3w eksperymentalnych.&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data = np.random.rand(10, 10) \n\nplt.imshow(data, cmap='hot', interpolation='nearest') \n\nplt.colorbar() \n\nplt.title('Mapa ciep\u0142a (heatmap)') \n\nplt.show() \n\n# Mapa ciep\u0142a dla ekspresji gen\u00f3w \n\ngeny = 50 \n\nwarunki = 10 \n\nekspresja_genow = np.random.rand(geny, warunki) \n\nplt.imshow(ekspresja_genow, cmap='coolwarm', aspect='auto') \n\nplt.colorbar() \n\nplt.xlabel('Warunki eksperymentalne') \n\nplt.ylabel('Geny') \n\nplt.title('Poziomy ekspresji gen\u00f3w w warunkach eksperymentalnych') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"387\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_7.png\" alt=\"Rys. 7 Przyk\u0142ad mapy ciep\u0142a dla warto\u015bci losowych.\u00a0\" class=\"wp-image-32129\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_7.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_7-300x152.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_7-495x251.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 7 Przyk\u0142ad mapy ciep\u0142a dla warto\u015bci losowych.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>6. <strong>Wykres konturowy<\/strong> \u2013 u\u017cywany jest do obrazowania danych tr\u00f3jwymiarowych w postaci linii poziomicy na powierzchni dwuwymiarowej. Wizualizuje warto\u015bci, kt\u00f3re s\u0105 r\u00f3wne dla konkretnej funkcji na danej p\u0142aszczy\u017anie. Przyk\u0142adem mo\u017ce by\u0107 np. wizualizacja danych pogodowych lub warto\u015bci ci\u015bnienia atmosferycznego na mapie meteorologicznej.&nbsp;&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">x = np.linspace(-10, 40, 100)  # d\u0142ugo\u015b\u0107 geograficzna dla Europy (w przybli\u017ceniu) \n\ny = np.linspace(35, 70, 100)   # szeroko\u015b\u0107 geograficzna dla Europy (w przybli\u017ceniu) \n\nX, Y = np.meshgrid(x, y) \n\ncisnienie = 1000 + 10 * np.sin(np.sqrt((X - 10)**2 + (Y - 50)**2)) \n\nplt.contour(X, Y, cisnienie, levels=20, cmap='coolwarm') \n\nplt.xlabel('D\u0142ugo\u015b\u0107 geograficzna') \n\nplt.ylabel('Szeroko\u015b\u0107 geograficzna') \n\nplt.title('Ci\u015bnienie atmosferyczne na mapie meteorologicznej') \n\nplt.colorbar(label='hPa') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"452\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_8.png\" alt=\"Rys. 8 Przyk\u0142ad mapy ciep\u0142a dla poziomu ekspresji gen\u00f3w.\u00a0\" class=\"wp-image-32132\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_8.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_8-300x178.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_8-495x294.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 8 Przyk\u0142ad mapy ciep\u0142a dla poziomu ekspresji gen\u00f3w.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>7. <strong>Wykres 3D<\/strong> \u2013 powierzchniowy dla funkcji dw\u00f3ch zmiennych, w tym przypadku funkcji sinusoidalnej na siatce punkt\u00f3w.&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np \n\nimport matplotlib.pyplot as plt \n\nfrom mpl_toolkits.mplot3d import Axes3D \n\n# Definiowanie danych \n\nx = np.linspace(-5, 5, 100) \n\ny = np.linspace(-5, 5, 100) \n\nx, y = np.meshgrid(x, y) \n\nz = np.sin(np.sqrt(x**2 + y**2)) \n\n# Inicjalizacja wykresu 3D \n\nfig = plt.figure() \n\nax = fig.add_subplot(111, projection='3d') \n\n# Tworzenie wykresu powierzchniowego \n\nsurf = ax.plot_surface(x, y, z, cmap='plasma', edgecolors='k', linewidth=0.5) \n\n# Dodanie paska kolor\u00f3w \n\ncbar = fig.colorbar(surf, pad=0.15, shrink=0.5, aspect=5) \n\ncbar.ax.yaxis.set_ticks_position('right') \n\n# Etykiety osi \n\nax.set_xlabel('O\u015b X', labelpad=10) # labelpad zapobiega nak\u0142adaniu si\u0119 osi \n\nax.set_ylabel('O\u015b Y', labelpad=10) \n\nax.set_zlabel('O\u015b Z', labelpad=10) \n\n# Tytu\u0142 wykresu \n\nax.set_title('Wykres powierzchniowy') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"417\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_9.png\" alt=\"Rys. 9. Przyk\u0142ad wykresu powierzchniowego.\u00a0\" class=\"wp-image-32135\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_9.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_9-300x164.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_9-495x271.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\">Rys. 9. Przyk\u0142ad wykresu powierzchniowego.&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Pami\u0119taj, \u017ce powy\u017csze kody i wygenerowane wykresy to tylko przyk\u0142ady i nie musz\u0105 odzwierciedla\u0107 realnych sytuacji czy danych. Zach\u0119cam ci\u0119 do sprawdzenia wszystkich rodzaj\u00f3w wykres\u00f3w, kt\u00f3re szczeg\u00f3\u0142owo opisane s\u0105 w dokumentacji: <a href=\"https:\/\/matplotlib.org\/stable\/plot_types\/index.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/matplotlib.org\/stable\/plot_types\/index.html\" rel=\"noreferrer noopener\">Plot types \u2014 Matplotlib 3.7.1 documentation<\/a>.<\/p>\n\n\n\n<p>Znasz ju\u017c podstawowe rodzaje wykres\u00f3w i wiesz, jak je tworzy\u0107, dlatego w dalszej cz\u0119\u015bci tego artyku\u0142u na przyk\u0142adzie wykresu s\u0142upkowego poka\u017c\u0119 ci, jak mo\u017cesz dostosowa\u0107 wizualizacje, wykorzystuj\u0105c kilka dodatkowych element\u00f3w, jak siatka, linie pomocnicze i warto\u015bci nad s\u0142upkami, czyli etykiety (<strong>labels<\/strong>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Dostosowanie-wykresu\">Dostosowanie wykresu<\/h2>\n\n\n\n<p>Poni\u017cej znajduje si\u0119 prosty wykres ukazuj\u0105cy zestawienie dochodu firmy X na przestrzeni ostatnich 7 lat. Kod i wykres zamieszczam poni\u017cej.&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import matplotlib.pyplot as plt \n\n# Przyk\u0142adowe dane \n\nlata = ['2016', '2017', '2018', '2019', '2020', '2021', '2022'] \n\ndochody = [32, 45, 58, 64, 49, 59, 72] \n\nplt.bar(lata, dochody, alpha=0.7) \n\nplt.xlabel('Rok bud\u017cetowy') \n\nplt.ylabel('Doch\u00f3d (tys. PLN)') \n\nplt.title('Zestawienie dochod\u00f3w w tys. PLN na przestrzeni 7 lat') \n\nplt.plot(lata, dochody) \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"463\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_10.png\" alt=\"Rys. 10. Wykres ukazuj\u0105cy zestawienie dochod\u00f3w firmy X na przestrzeni lat.\u00a0\" class=\"wp-image-32138\" style=\"width:762px;height:463px\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_10.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_10-300x182.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_10-495x301.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 10. Wykres ukazuj\u0105cy zestawienie dochod\u00f3w firmy X na przestrzeni lat.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Dodajmy do wykresu kilka dodatkowych element\u00f3w, \u017ceby sprawi\u0107, by sta\u0142 si\u0119 czytelniejszy i odrobin\u0119 bardziej atrakcyjny wizualnie.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np \n\nimport matplotlib.pyplot as plt \n\n# Przyk\u0142adowe dane \n\nlata = ['2016', '2017', '2018', '2019', '2020', '2021', '2022'] \n\ndochody = [32, 45, 58, 64, 49, 59, 72] \n\nx_pos = np.arange(len(lata)) \n\nbars = plt.bar(x_pos, dochody, alpha=0.7) \n\nplt.xticks(x_pos, lata) \n\nplt.xlabel('Rok bud\u017cetowy') \n\nplt.ylabel('Doch\u00f3d (tys. PLN)') \n\nplt.title('Zestawienie dochod\u00f3w w tys. PLN na przestrzeni 7 lat') \n\nplt.plot(lata, dochody, \n\n         color='red', \n\n         linestyle='--', \n\n         linewidth=3, \n\n         marker='o', \n\n         markersize=10, \n\n         label='Linia') \n\nplt.grid(True, linestyle='--', linewidth=0.5, alpha=0.7, color='black') \n\nplt.gca().set_facecolor('whitesmoke') \n\nfor bar in bars: \n\n    height = bar.get_height() \n\n    plt.text(bar.get_x() + bar.get_width() \/ 2, height + 1, str(height), ha='center', va='bottom') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"463\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_11.png\" alt=\"Rys. 11. Wykres obrazuj\u0105cy zestawienie dochod\u00f3w firmy X z dodatkowymi elementami.\u00a0\" class=\"wp-image-32141\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_11.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_11-300x182.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_11-495x301.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 11. Wykres obrazuj\u0105cy zestawienie dochod\u00f3w firmy X z dodatkowymi elementami.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W powy\u017cszym przyk\u0142adzie na uwag\u0119 zas\u0142uguje funkcja \u2018<strong>text()<\/strong>\u2019, kt\u00f3ra znajduje si\u0119 w p\u0119tli \u2018<strong>for<\/strong>\u2019. Wspomniana funkcja dodaje warto\u015bci nad ka\u017cdym ze s\u0142upk\u00f3w wskazuj\u0105cych na doch\u00f3d w poszczeg\u00f3lnych latach. Jako argumenty przekazujemy po\u0142o\u017cenie na osi X <strong>(bar.get_x() + bar.get_width() \/ 2)<\/strong> oraz po\u0142o\u017cenie na osi Y (<strong>height + 1<\/strong>), a tak\u017ce tekst, kt\u00f3ry ma wy\u015bwietli\u0107 si\u0119 nad s\u0142upkami (<strong>str(height)<\/strong>) i parametry wyr\u00f3wnania tekstu wobec wsp\u00f3\u0142rz\u0119dnych, odpowiednio \u2018<strong>ha<\/strong>\u2019 \u2013 horizontal alignment i \u2018<strong>va<\/strong>\u2019 \u2013 vertical alignment. W celu zapoznania si\u0119 z innymi metodami i rodzajami nak\u0142adania etykiet (<strong>warto\u015bci<\/strong>) w wykresach s\u0142upkowych, ale te\u017c innych rodzajach wykres\u00f3w, odsy\u0142am do dokumentacji Matplotlib: <a href=\"https:\/\/matplotlib.org\/stable\/gallery\/lines_bars_and_markers\/bar_label_demo.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/matplotlib.org\/stable\/gallery\/lines_bars_and_markers\/bar_label_demo.html\" rel=\"noreferrer noopener\">Bar Label Demo \u2014 Matplotlib 3.7.1 documentation.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Wykresy-wieloosiowe\">Wykresy wieloosiowe<\/h2>\n\n\n\n<p>Czasami zdarzy si\u0119, \u017ce na jednej figurze (nie myli\u0107 z wykresem) chcesz umie\u015bci\u0107 dwa lub wi\u0119cej wykres\u00f3w. Na przyk\u0142ad, tworzysz prezentacj\u0119 na potrzeby szkolenia matematycznego dla licealist\u00f3w i chcesz przedstawi\u0107 wykres funkcji sinus i cosinus. W celu dodania kolejnego wykresu do tej samej figury mo\u017cemy skorzysta\u0107 z funkcji \u2018<strong>add_subplot()<\/strong>\u2019 lub funkcji \u2018<strong>subplots()<\/strong>\u2019. Oczywi\u015bcie ka\u017cdy wykres lub o\u015b b\u0119dzie trzeba skonfigurowa\u0107 osobno, ale jak ju\u017c wiesz, nie s\u0105 to skomplikowane operacje. Kod i wykresy na jednej figurze zamieszczam poni\u017cej:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np \n\nimport matplotlib.pyplot as plt \n\nx = np.linspace(0, 10, 100) \n\ny1 = np.sin(x) \n\ny2 = np.cos(x) \n\nfig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 6)) \n\n# Ustawienie odst\u0119pu mi\u0119dzy wykresami \n\nplt.subplots_adjust(hspace=0.5) \n\nax1.plot(x, y1, color='blue', label='sin(x)') \n\nax1.set_xlabel('O\u015b X') \n\nax1.set_ylabel('sin(x)') \n\nax1.legend() \n\nax2.plot(x, y2, color='red', label='cos(x)') \n\nax2.set_xlabel('O\u015b X') \n\nax2.set_ylabel('cos(x)') \n\nax2.legend() \n\nplt.show() <\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"480\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_12.png\" alt=\"Rys. 12. Figura z dwoma wykresami liniowymi na dw\u00f3ch osiach.\u00a0\" class=\"wp-image-32144\" style=\"width:762px;height:480px\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_12.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_12-300x189.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_12-495x312.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 12. Figura z dwoma wykresami liniowymi na dw\u00f3ch osiach.<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Pierwszy wykres (na g\u00f3rze) przedstawia funkcj\u0119 sinusoidaln\u0105 sin(x), gdzie warto\u015b\u0107 na osi X jest przedstawiona przez x, a warto\u015b\u0107 na osi Y przedstawia sin(x). Wykres ma niebieski kolor linii i etykiet\u0119 \u2018sin(x)\u2019.<\/p>\n\n\n\n<p>Drugi wykres (na dole) przedstawia funkcj\u0119 cosinusoidaln\u0105 cos(x), gdzie warto\u015b\u0107 na osi X jest przedstawiona przez x, a warto\u015b\u0107 na osi Y przedstawia cos(x). Wykres ma czerwony kolor linii i etykiet\u0119 \u2018cos(x)\u2019.<\/p>\n\n\n\n<p>Oba wykresy s\u0105 umieszczone w jednej kolumnie i dw\u00f3ch wierszach, ze wsp\u00f3ln\u0105 osi\u0105 X, kt\u00f3ra przedstawia zakres warto\u015bci x od 0 do 10. W kolejnym przyk\u0142adzie poka\u017c\u0119 ci na\u0142o\u017cenie wykres\u00f3w na siebie.<\/p>\n\n\n\n<p>Wieloosiowe wykresy mog\u0105 by\u0107 przydatne w r\u00f3\u017cnych zastosowaniach, takich jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Por\u00f3wnywanie r\u00f3\u017cnych wielko\u015bci na jednym wykresie.<\/li>\n\n\n\n<li>Przedstawianie wielko\u015bci w r\u00f3\u017cnych jednostkach lub zakresach warto\u015bci.<\/li>\n\n\n\n<li>Prezentowanie danych zwi\u0105zanych z czasem, gdzie warto\u015bci dla r\u00f3\u017cnych wielko\u015bci maj\u0105 wsp\u00f3ln\u0105 o\u015b czasu.<\/li>\n<\/ul>\n\n\n\n<p>Poni\u017cej przedstawiam przyk\u0142ad z na\u0142o\u017conymi krzywymi (sinus i cosinus) na jednym wykresie.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np \n\nimport matplotlib.pyplot as plt \n\nx = np.linspace(0, 10, 100) \n\ny1 = np.sin(x) \n\ny2 = np.cos(x) \n\nfig, ax1 = plt.subplots(figsize=(8, 4)) # figsize pozwala na ustalenie rozmiaru figury \n\n# Rysowanie sinusa na pierwszej osi \n\nax1.plot(x, y1, color='blue', label='sin(x)') \n\nax1.set_xlabel('O\u015b X') \n\nax1.set_ylabel('sin(x)', color='blue') \n\nax1.tick_params(axis='y', labelcolor='blue') \n\n# Tworzenie drugiej osi dla cosinusa \n\nax2 = ax1.twinx() \n\nax2.plot(x, y2, color='red', label='cos(x)') \n\nax2.set_ylabel('cos(x)', color='red') \n\nax2.tick_params(axis='y', labelcolor='red') \n\n# Dodawanie legendy \n\nfig.legend(loc='upper right') \n\nplt.grid(True, linestyle='--', linewidth=0.5, alpha=0.7, color='black') \n\nplt.title('Wykres wieloosiowy z sin(x) i cos(x)') \n\nplt.show() <\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"330\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_13.png\" alt=\"Rys. 13. Wykres wieloosiowy przedstawiaj\u0105cy por\u00f3wnanie krzywych funkcji sin(x) i cos(x).\u00a0\" class=\"wp-image-32147\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_13.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_13-300x130.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.05.10_graphic_13-495x214.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><figcaption class=\"wp-element-caption\"><em>Rys. 13. Wykres wieloosiowy przedstawiaj\u0105cy por\u00f3wnanie krzywych funkcji sin(x) i cos(x).<\/em>&nbsp;<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W powy\u017cszym przyk\u0142adzie, ax1 jest osi\u0105 Y dla sin(x), a ax2 jest osi\u0105 Y dla cos(x). U\u017cywaj\u0105c funkcji twinx(), utworzyli\u015bmy drug\u0105 o\u015b Y, kt\u00f3ra wsp\u00f3\u0142dzieli wsp\u00f3ln\u0105 o\u015b X z pierwsz\u0105 osi\u0105 Y. Nast\u0119pnie narysowali\u015bmy funkcje sinusoidaln\u0105 i cosinusoidaln\u0105 na odpowiednich osiach, u\u017cywaj\u0105c r\u00f3\u017cnych kolor\u00f3w dla linii i etykiet. W ten spos\u00f3b obie funkcje s\u0105 przedstawione na jednym wykresie z dwiema osiami Y. Rozmiar figury zosta\u0142 zmieniony na 8 cali szeroko\u015bci i 4 cale wysoko\u015bci za pomoc\u0105 parametru \u2018<strong>figsize<\/strong>\u2019. Zach\u0119cam do eksperymentowania z parametrami w celu uzyskania optymalnych rozwi\u0105za\u0144. Ponownie odsy\u0142am do dokumentacji w celu zapoznania si\u0119 z pe\u0142nym zakresem parametr\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Podsumowanie-i-cheat-sheet\">Podsumowanie i cheat sheet<\/h2>\n\n\n\n<p>My\u015bl\u0119, \u017ce w tym artykule uda\u0142o mi si\u0119 pokaza\u0107 ci podstawy tworzenia wykres\u00f3w i pracy z bibliotek\u0105 Matplotlib. Zebra\u0142em te\u017c najwa\u017cniejsze funkcje i fragmenty kodu, kt\u00f3re mo\u017cesz wykorzysta\u0107 podczas pracy z wizualizacjami, korzystaj\u0105c z Matplotlib.<\/p>\n\n\n\n<p><strong>Importowanie biblioteki:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import matplotlib.pyplot as plt <\/pre>\n\n\n\n<p><strong>Tworzenie wykres\u00f3w:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Wykres liniowy \n\nplt.plot(x, y) \n\n# Wykres punktowy (scatter plot) \n\nplt.scatter(x, y) \n\n# Histogram \n\nplt.hist(x, bins) \n\n# Wykres s\u0142upkowy (bar plot) \n\nplt.bar(x, y) \n\n# Wykres ko\u0142owy (pie chart) \n\nplt.pie(values, labels=labels) \n\n# Heatmap \n\nplt.imshow(matrix, cmap='hot') \n\n# Wykres konturowy (contour plot) \n\nplt.contour(X, Y, Z) <\/pre>\n\n\n\n<p><strong>Wy\u015bwietlanie wykresu:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">plt.show() <\/pre>\n\n\n\n<p><strong>Formatowanie wykres\u00f3w:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Tytu\u0142 wykresu \n\nplt.title(\"Tytu\u0142\") \n\n# Etykiety osi \n\nplt.xlabel(\"O\u015b X\") \n\nplt.ylabel(\"O\u015b Y\") \n\n# Legenda \n\nplt.legend() \n\n# Siatka (grid) \n\nplt.grid() \n\n# Ograniczenie zakresu osi \n\nplt.xlim(min_x, max_x) \n\nplt.ylim(min_y, max_y) \n\n# Skala logarytmiczna \n\nplt.xscale('log') \n\nplt.yscale('log') <\/pre>\n\n\n\n<p><strong>Personalizacja wykres\u00f3w:<\/strong>&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Kolor linii \n\nplt.plot(x, y, color='red') \n\n# Styl linii (liniowy, przerywany, kropkowany) \n\nplt.plot(x, y, linestyle='-') \n\nplt.plot(x, y, linestyle='--') \n\nplt.plot(x, y, linestyle=':') \n\n# Znaczniki punkt\u00f3w \n\nplt.plot(x, y, marker='o') \n\nplt.plot(x, y, marker='x') \n\nplt.plot(x, y, marker='+') \n\n# Grubo\u015b\u0107 linii \n\nplt.plot(x, y, linewidth=2) <\/pre>\n\n\n\n<p><strong>Tworzenie wykres\u00f3w wieloosiowych:<\/strong>&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Tworzenie wykres\u00f3w z wieloma osiami Y \n\nfig, ax1 = plt.subplots() \n\nax2 = ax1.twinx() \n\nax1.plot(x1, y1, 'g-') \n\nax2.plot(x2, y2, 'b-') \n\nax1.set_xlabel('O\u015b X') \n\nax1.set_ylabel('y1', color='g') \n\nax2.set_ylabel('y2', color='b') <\/pre>\n\n\n\n<p><strong>Zapisywanie wykresu jako obraz:<\/strong>&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">plt.savefig(\"nazwa_pliku.png\", dpi=300) <\/pre>\n\n\n\n<p><strong>Link do dokumentacji Matplotlib:&nbsp;<br><\/strong><a href=\"https:\/\/matplotlib.org\/stable\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\">Matplotlib documentation \u2014 Matplotlib 3.7.1 documentation<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym artykule chcia\u0142bym wprowadzi\u0107 ci\u0119 do kolejnej z najpopularniejszych, obok NumPy i SciPy, bibliotek j\u0119zyka Python, czyli Matplotlib. Biblioteka Matplotlib pozwala na wizualizacje danych z wykorzystaniem r\u00f3\u017cnego rodzaju wykres\u00f3w, takich jak s\u0142upkowe, ko\u0142owe, histogramy i mapy. W dalszych akapitach zapoznasz si\u0119 z podstawowymi i \u015bredniozaawansowanymi mo\u017cliwo\u015bciami tej biblioteki, kt\u00f3ra na co dzie\u0144 wykorzystywana jest przez miliony naukowc\u00f3w, in\u017cynier\u00f3w i analityk\u00f3w na ca\u0142ym \u015bwiecie.<\/p>\n","protected":false},"author":137,"featured_media":29163,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":2965,"footnotes":""},"categories":[1,582],"tags":[602],"offering":[522],"class_list":["post-29161","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-python-2","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/137"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=29161"}],"version-history":[{"count":3,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29161\/revisions"}],"predecessor-version":[{"id":32150,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29161\/revisions\/32150"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/29163"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=29161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=29161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=29161"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=29161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}