Blog JSystems - z miłości do programowania

Wizualizacja danych na wykresach - pakiet Matplotlib



W tym rozdziale zajmiemy się wizualizacją danych w formie wykresów. Umiejętność ta może się przydać zarówno analitykom danych, jak i administratorom.


Pierwszy wykres liniowy


Zaczniemy od narysowania prostego wykresu liniowego, opartego o 100 losowych wartości z zakresu 0-100.


import matplotlib.pyplot as plt
from random import random
y=[random()*100 for e in range(100)]
plt.plot(y)
plt.show()


W pierwszej kolejności należy zaimportować moduł pyplot, co czynimy w pierwszej linii. Import funkcji random nie jest związany z samym rysowaniem wykresów,  wykorzystujemy ją tylko do generowania losowych wartości na potrzeby wykresu. Robimy to w linii trzeciej, tworząc listę losowych wartości z zakresu 0-100. Wartości używane w wykresach mogą być zarówno całkowite jak i zmiennoprzecinkowe. Taką listę przekazujemy do funkcji plot która rysuje linię. Wykres jednak nie pokaże się dopóki nie wywołamy funkcji show() na końcu.  Poniżej efekt działania powyższego kodu:


27.png (525×394)


Nanoszenie dodatkowych serii


Często zdarza się, że musimy nałożyć kilka serii (linii) na siebie, choćby w celach porównawczych. Wystarczy ponownie wywołać funkcję plot podając kolejną serię danych:


import matplotlib.pyplot as plt
from random import random
y=[random()*100 for e in range(10)]
z=[random()*100 for e in range(10)]
plt.plot(y)
plt.plot(z)
plt.show()


Powyższy kod to nieco zmodyfikowany poprzedni przykład. Dodałem nową serię „z”, a następne przekazałem ją do kolejnego wywołania funkcji plot. Efekt działania:


28.png (523×392)


Dodawanie legendy do wykresu


Aby dodać  legendę do wykresu trzeba zrobić dwie rzeczy. Po pierwsze nadać nazwy seriom, po drugie wywołać funkcję legend():


import matplotlib.pyplot as plt
from random import random
y=[random()*100 for e in range(10)]
z=[random()*100 for e in range(10)]
plt.plot(y,label='Seria y')
plt.plot(z,label='Seria z')
plt.legend()
plt.show()


Jeśli przy części serii nie podamy etykiety, nie zostanie ona uwzględniona w legendzie. Wynik działania:


29.png (525×394)


Etykiety osi X i Y


Aby ustawić etykiety osi x i y, wystarczy wywołać odpowiednio funkcje xlabel i ylabel:


import matplotlib.pyplot as plt
from random import random
y=[random()*100 for e in range(10)]
plt.plot(y,label='Seria y')
plt.xlabel('oś X')
plt.ylabel('oś Y')
plt.legend()
plt.show()


Efekt działania:


31.png (521×391)


Zmiana rodzaju i koloru linii


Funkcjonalność bardzo przydatna zwłaszcza gdy zechcesz nanieść na wykres kilka serii – łatwiej będzie Ci odróżnić.


import matplotlib.pyplot as plt
from random import random
a=[random()*100 for e in range(10)]
b=[random()*100 for e in range(10)]
c=[random()*100 for e in range(10)]
plt.plot(a,'b-',label='seria a')
plt.plot(b,'r--',label='seria b')
plt.plot(c,'g:',label='seria c')
plt.legend()
plt.grid()
plt.show() 


W powyższym fragmencie kodu pokazuję zmianę koloru i stylu linii w oparciu o pozycję argumentu. W tym przypadku zmiana koloru i stylu linii odbywa się przez drugi argument funkcji plot. Pierwszy znak – odpowiednio b,r,g, odnosi się do koloru (blue, red, green). Powinno być rgb (hermetyczny żarcik 😉 ) . Następujące po literkach znaki odnoszą się do rodzaju linii – odpowiednio linia, przerywana linia i kropki. Wariantów jest oczywiście więcej i tu w myśl rtfm odsyłam do dokumentacji 😉 Dodałem też wartość dla argumentu „label”, by pokazać że można stosować te ustawienia jednocześnie.


33.png (525×393)


Kolory serii możesz zmieniać również korzystając podając w drugim argumencie kod koloru hexem:


import matplotlib.pyplot as plt
from random import random
a=[random()*100 for e in range(10)]
plt.plot(a,'#FFAA00')
plt.show()


Efekt:


34.png (533×400)


Możesz też użyć argumentu o nazwie „color”:


import matplotlib.pyplot as plt
from random import random
a=[random()*100 for e in range(10)]
plt.plot(a,color='#FFAABB')
plt.show()


W którym możesz podać też nazwę koloru – red, blue etc.


 


Siatka na wykresie


Wywołujemy funkcję grid():


import matplotlib.pyplot as plt
from random import random
y=[random()*100 for e in range(10)]
plt.plot(y)
plt.grid()
plt.show()


Skutek:


35.png (540×405)


Zapisywanie wykresu do pliku


Każdy stworzony wykres można zapisać do pliku graficznego. Sprowadza się to do wywołania funkcji savefig. Nazwę pliku podajemy z rozszerzeniem, funkcja sama dopasuje odpowiedni format zapisu. Plik zostanie umieszczony w tym przypadku wewnątrz projektu – użyłem samej nazwy, ale możesz również podać ścieżkę bezwzględną:


import matplotlib.pyplot as plt
from random import random
a=[random()*100 for e in range(10)]
plt.plot(a)
plt.savefig('wykres.png')
plt.show()


 


Wykresy słupkowe


Generowanie wykresów słupkowych wygląda bardzo podobnie do generowania wykresów liniowych, z drobnymi zmianami. Dla wykresów słupkowych działają te same funkcjonalności – siatka, zapisywanie wykresu do pliku, legenda etc w taki sam sposób jak dla wykresów liniowych.


import matplotlib.pyplot as plt
from random import random
x=list(range(12))
y=[random()*10000 for e in range(12)]
plt.bar(x,y)
plt.show()


36.png (477×357)


Aby stworzyć wykres słupkowy, zamiast funkcji plot używamy funkcji bar. Pojawia się też dosyć enigmatyczny argument x – w wykresach liniowych ładowaliśmy tylko dane dla serii. W przypadku wykresów słupkowych należy podać dwie listy – jedna zawierająca wartości dla osi X, druga wartości liczbowe dla których mają powstać słupki. Ilość elementów w obu listach musi być taka sama.


 


Zmiana koloru słupków


Aby zmienić kolor słupków musimy z funkcji bar odebrać handler dla wykresu. W kolejnym kroku ustawiamy kolor (hexadecymalnie albo literalnie). Możemy zmieniać kolory słupków pozycyjnie, co prezentuję na poniższym przykładzie. Zmieniam kolor pierwszego słupka (wykres[0]).


import matplotlib.pyplot as plt
from random import random
x=list(range(12))
y=[random()*10000 for e in range(12)]
wykres=plt.bar(x,y)
wykres[0].set_color('r')
plt.show()


37.png (509×382)


Jeśli zechcemy zmienić na taki sam kolor wszystkich słupków, musimy posłużyć się iteracją:


import matplotlib.pyplot as plt
from random import random
x=list(range(12))
y=[random()*10000 for e in range(12)]
wykres=plt.bar(x,y)
for i in range(len(wykres)):
    wykres[i].set_color('r')
plt.show()


38.png (537×403)


Nakładanie serii słupkowych i liniowych na siebie


Aby uzyskać na jednym wykresie zarówno słupki jak i linie, wykorzystujemy funkcję plot i funkcję bar jednocześnie:


import matplotlib.pyplot as plt
from random import random
x=list(range(12))
y=[random()*10000 for e in range(12)]
z=[random()*10000 for e in range(12)]
plt.bar(x,y)
plt.plot(z,'r')
plt.show()


39.png (605×454)


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!