Blog JSystems - uwalniamy wiedzę!

Szukaj

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)

 

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...