Matplotlib ilə plan qurmaq

matplotlib nədir?

Python proqramlaşdırma dili və onun ədədi riyaziyyat genişlənməsi NumPy adlı öz planlaşdırma kitabxanasına malikdir matplotlib. O, Tkinter, wxPython, Qt və ya GTK+ kimi ümumi təyinatlı GUI alət dəstlərindən istifadə edərək proqramlara süjetləri daxil edə biləcəyiniz obyekt yönümlü API təmin edir. John D. Hunter əvvəlcə Matplotlib-i yazmışdı, lakin o, 2012-ci ildə 44 yaşında vəfat etdi. O vaxtdan bəri bu, başqaları tərəfindən dəstəklənən aktiv inkişaf icması olmuşdur.

Dediyi kimi, “Bir şəkil min sözdən dəyərlidir” Python-da massivlərin 2 ölçülü planlaşdırılması üçün matplotlib adlı bu vizuallaşdırma kitabxanası var. Matplotlib ilə siz xətt, bar, səpələnmə, histoqram və s. kimi bir neçə süjet edə bilərsiniz.

Matplotlib nəhəng bir kitabxanadır və düzgün süjet əldə etmək sınaq və səhv yolu ilə əldə edilir. Əsas süjet yaratmaq daha asan bir şeydir, lakin matplotlib kitabxanası üzərində bir əmrə sahib olmaq olduqca çətindir.

Bu dərslik nəzəriyyə və nümunələrin qarışığı ilə başlanğıcdan orta səviyyəyə qədərdir. Biz əhatə edəcəyik:

  • pyplot və pylab
  • matplotlib-in əsas anlayışları
  • plt.subplots()
  • matplotlib ilə massivlərin vizuallaşdırılması
  • pandalar və matplotlib ilə hiylə qurmaq

Niyə matplotlib çaşdırır:

Matplotlib kitabxanasında böyük sənədlər olsa da, aşağıdakı amillərə görə matplotlib öyrənmək o qədər də asan deyil:

  • Artıq qeyd edildiyi kimi, kitabxananın özü böyük kod xətləri ilə olduqca böyükdür.
  • matplotlib bir neçə interfeysə malikdir və bir neçə fərqli backend ilə inteqrasiya oluna bilər. Backend yalnız diaqramların daxili quruluşu ilə deyil, həm də necə göstərildiyi ilə məşğul olur.
  • Sənədlər geniş olsa da, köhnəlmişdir. Köhnə nümunələr hələ də inkişaf edən kitabxana ilə birlikdə gəzir.

Nümunələrə keçməzdən əvvəl matplotlib dizaynının əsas anlayışlarını öyrənək.

Pylab:

Pyplot, MATLAB kimi interfeys əldə edə biləcəyiniz Matplotlib moduludur. MATLAB-ın üstünlüklərindən biri onun qlobal miqyasda tətbiq oluna bilməsidir. Python-dan fərqli olaraq, idxal MATLAB-da çox istifadə edilmir. MATLAB-ın əksər funksiyaları ən yüksək səviyyədə olan istifadəçilər üçün asanlıqla mövcuddur.

Pylab matplotlib və NumPy-dən sinifləri və funksiyaları bir araya gətirir. MATLAB ilə tanış olan insanlar Pylab-a asanlıqla uyğunlaşdırıla bilər, çünki idxaldan istifadəyə çox ehtiyac yoxdur. Sadəcə bu bir sətir əlavə etməklə

from pylab import *

keçmiş MATLAB istifadəçiləri MATLAB-da olduğu kimi plot() və ya array() funksiyalarına zəng edə bilərlər.

Lakin Python istifadəçiləri bilirlər ki, import * istifadə etmək pis kodlaşdırma təcrübəsidir, çünki o, hər şeyi ad sahəsinə idxal edir. Nəticədə, lazımsız yerə Python-un daxili qurğularının üzərinə yaza bilərsiniz. Və səhvləri tapmaq çətinləşir. Buna görə də MATLAB öz dərsliklərində import * istifadə etməməyi tövsiyə edir. İdxal əvəzinə IPython-u inteqrasiya etmək üçün %matplotlib-dən istifadə etməliyik.

Pylab mənbə kodu əslində bir çox potensial ziddiyyətli idxalı maskalayır. Məsələn, terminalda python –pylab istifadə edərək və ya command line, və ya %pylab əslində başlıq altında 'from pylab import *' çağırır.

Matplotlib, pylab-dan artıq istifadə etməməyi açıq şəkildə tövsiyə etsə də, hələ də mövcuddur. Pylab istifadə etmək əvəzinə biz pyplot istifadə edə bilərik. pyplot matplotlib-i komanda stili funksiyaları toplusu ilə MATLAB kimi işləməyə məcbur edir.

import matplotlib.pyplot as plt

Matplotlib iyerarxiyası:

Obyekt iyerarxiyası matplotlibin əsas anlayışlarından biridir. Əgər siz artıq başqa bir matplotlib dərsliyindən keçmisinizsə, bu xəttə rast gələ bilərsiniz:

plt.plot([1, 2, 3])

Sadə bir sətirli koda bənzəyir, lakin süjet əslində yuvalanmış piton obyektlərinin nərdivanıdır. Hər bir süjetin altında matplotlib obyektlərinin strukturu mövcuddur.

The Şəkil obyekt bütün süjet elementləri üçün yüksək səviyyəli konteynerdir, çoxlu Oxları ehtiva edir. Baltalar oxdan fərqlidir. The Baltalar XAxis, Yaxis kimi bir neçə obyekti saxlayan obyektdir və biz onun metodlarını çağıraraq süjetlər yarada bilərik.

Bütün şəkildə, Şəkil bir neçə baltadan ibarət qutuya bənzər bir qabdır. İyerarxiyada gənələr, fərdi sətirlər, əfsanələr və oxların altında mətn qutuları kimi daha kiçik obyektlər var. Gənələrdən və etiketlərdən başlayaraq diaqramdakı hər bir element Python obyektidir.

Pin

Yuxarıdakı diaqram matplotlib iyerarxiyasına bir nümunədir. Bununla tanış deyilsinizsə, narahat olmayın, biz təlimatımızda danışacağıq.

Əgər sizdə matplotlib quraşdırılmayıbsa, onu təlimatınızda aşağıdakı əmrdən istifadə edərək quraşdırın.

pip install matplotlib

Aşağıdakı kodu icra edin:

import matplotlib.pyplot as plt

figure,_=plt.subplots()
print(type(figure))

plt.subplots() 2 obyekti ehtiva edən dəftəri qaytarır. Hələlik gəlin yalnız Şəkil obyekti olan tuplenin birinci obyektinə diqqət yetirək. Biz fiqurun iyerarxiyasını qazmaqla birinci oxlar obyektinin yaxisinin ilk işarəsini əldə edə bilərik.

import matplotlib.pyplot as plt

figure,_=plt.subplots()

# To get first axes of figure
first_axes=figure.axes[0]

# yaxis of first axes object
yaxis=first_axes.yaxis

# first tick of the yaxis of the first axes
first_tick_of_yaxis=yaxis.get_major_ticks()[0]
print(type(first_tick_of_yaxis))

Şəkildə Baltaların siyahısı var. Və hər bir Balta bir xaxis və yaxis var, onların hər birində çoxsaylı əsas gənələr var.

import matplotlib.pyplot as plt

figure,_=plt.subplots()

axes=figure.axes
print(type(axes))

matplotlib bunu fiqur iyerarxiyası deyil, fiqur anatomiyası adlandırır. Siz rəsmi matplotlib sənədlərində fiqur illüstrasiyasının anatomiyasını tapa bilərsiniz.

Pin

Dövlət və Vətəndaşsız yanaşma:

Vizuallaşdırmalara keçməzdən əvvəl biz dövlət əsaslı və ya statuslu və vətəndaşlığı olmayan və ya obyekt yönümlü interfeys arasındakı fərqi başa düşməliyik.

Matplotlib-dən pyplot modulunu idxal edə və aşağıdakı əmri yazaraq onu plt adlandıra bilərik.

import matplotlib.pyplot as plt

Pyplotun bütün funksiyaları, məsələn plt.plot() mövcud rəqəmə və oxlara aiddir. Mövcud rəqəmlər və baltalar yoxdursa, yenisini yaradır. Matplotlib sənədlərində qeyd edildiyi kimi, “[Piplot ilə] cari şəkildəki cari oxlara süjet elementləri (xətlər, şəkillər, mətn və s.) əlavə etmək üçün sadə funksiyalardan istifadə olunur”.

Vəziyyəti olan və vətəndaşlığı olmayan interfeys arasındakı fərq:

Keçmiş MATLAB istifadəçiləri bunu “plt.plot() dövlət əsaslı/statü-maşın interfeysidir və cari rəqəmi gizli şəkildə izləyir.

  • plt.plot() və pyplotun digər funksiyaları yuxarı səviyyədə statuslu interfeys zəngləri edir. plt.plot() cari rəqəmə və oxlara istinad etdiyi üçün istənilən vaxt siz yalnız bir fiqur və balta ilə manipulyasiya edə bilərsiniz. Bizə açıq şəkildə istinad etməyə belə ehtiyac yoxdur.
  • Obyekt yönümlü yanaşmada biz yuxarıda göstərilən əməliyyatları açıq şəkildə yerinə yetiririk və obyekt istinadlarını dəyişənlərə götürürük və Axes obyektinin metodlarını çağırmaqla əsas obyektləri birbaşa dəyişdirə bilərik. Axes obyekti süjetin özünü təmsil edir.

Bu, dövlət interfeysinə bir nümunədir:

plt.plot()

Cari Axes obyektini alırıq. gca() burada metod deyil funksiyadır:

ax=plt.gca()

Pyplotda əksər funksiyalar matplotlib.axes.Axes sinfinin metodları kimi də mövcuddur. Cari rəqəmdə gca metodunu çağırırıq:

gcf().gca(**kvargs)

# matplotlib/pyplot.py
>>> def plot(*args, **kwargs):
...     ax = plt.gca()
...     return ax.plot(*args, **kwargs)

>>> def gca(**kwargs):
...     """This returns current axes of the current figure."""
...     return plt.gcf().gca(**kwargs)

plt.plot() cari rəqəmin cari oxlarını qaytarır. Dövlət interfeysi istinad etmək istədiyi süjeti gizli şəkildə izləyir.

Obyekt yönümlü yanaşmada müvafiq alıcı və təyinedici üsullar mövcuddur.

Nümunələr: ax.set_title(), ax.get_title()

plt.title() və gca().set_title() zəngləri eyni şeyi edir. Onun etdiyi budur:

  • gca() cari oxları qaytarır
  • set_title() təyinedici metodu cari oxlar üçün başlığı təyin edir. Burada biz heç bir balta obyektini açıq şəkildə qeyd etmirik.

Eynilə plt.grid(), plt.ylabels(), plt.legend() və s. bütün yuxarı səviyyəli funksiyalar gca() ilə cari oxların təyin edilməsinin eyni strukturunu izləyir və cari oxlar metodunu çağırır.

plt.subplots():

Qrafik mürəkkəbləşdikdə obyekt yönümlü yanaşma əlverişlidir. Bu anlayışları başa düşmək üçün bəzi planlar quraq.

plt.subplots() ilə obyekt yönümlüdə biz tək Oxlarla Şəkil yarada bilərik. Bu, obyekt yönümlü yanaşma ilə Şəkil və Baltalar yaratdığımız yeganə yerdir.

figure,axes=plt.subplots()

plt.sublpots() tək rəqəm və tək AxesSubplot obyektini qaytarır.

>>> type(figure)
<class 'matplotlib.figure.Figure'>
>>> type(axes)
<class 'matplotlib.axes._subplots.AxesSubplot'>

plt.subplots() çağırarkən biz heç bir arqument çağırmırıq. The default arqumentlər nrows=1 və ncols=1-dir.

AxesSubplot obyektimiz olduğundan, onun metodlarını pyplotun funksiyalarını adlandırdığımız kimi adlandıra bilərik.

Yığılmış sahə qrafiki:

Üç vaxt seriyasının yığılmış sahə qrafikinin nümunəsinə baxaq.

Terminalınıza aşağıdakı əmri yazaraq numpy quraşdırın.

pip install numpy

Aşağıdakı kod qrafiki yaradır:

import matplotlib.pyplot as plt
import numpy as np

range=np.arange(50)
rnd=np.random.randint(0,10,size=(3,range.size))
years=1950+range
figure,axes=plt.subplots(figsize=(5,3))
axes.stackplot(years, range + rnd, labels=['Eastasia', 'Eurasia', 'Oceania'])
axes.set_title('Combined debt growth over time')
axes.legend(loc='upper left')
axes.set_ylabel('Total debt')
axes.set_xlim(xmin=years[0],xmax=years[-1])
figure.tight_layout()

plt.show()

Yuxarıdakı kodun izahı budur:

  • np.arange(50): uzunluğu 1 olan 50d massivi yaradır rəqəmlər dəyişir 1 olan 50 üçün
  • random.randint(): Funksiya müəyyən formada massivi qaytarır və aşağıdan yuxarıya qədər təsadüfi ədədlərlə doldurur. Ən yüksək limit eksklüzivdir. Bizim vəziyyətimizdə ən aşağı həddi 0, ən yüksək həddi 10, ölçüsü isə (3, diapazon.size) təşkil edir. Çıxış 2-dan 3-a qədər (daxil deyil) rəqəmlərlə doldurulmuş 50*0 ölçülü 10d massiv olacaq.
  • Biz figsize atributu ilə rəqəmin enini və hündürlüyünü “düym” vahidində təyin edə bilərik.
  • stackplot(): Bu, bir-birinə yüklənmiş hər bir hissəni və hər bir hissənin tam bir rəqəmin yaradılmasına necə töhfə verdiyini göstərir. O, məlumatların müxtəlif bölmələrini göstərir və pasta diaqramı kimi fəaliyyət göstərir. Onun x-etiketi, y-etiketi və başlığı var ki, burada biz müxtəlif hissələri müxtəlif rənglərlə təmsil edə bilərik.
  • set_title(): Addan göründüyü kimi, bu təyinedici metod başlığı təyin edir.
  • legend(): Qrafikin elementlərini təsvir edən sahə.
  • set_ylabel: Y oxu üçün etiketi təyin edir.
  • set_xlim: X oxu üçün limit təyin edir.
  • tight_layout: Müəyyən edilmiş dolğunluğu vermək üçün o, subplotun parametrlərini avtomatik tənzimləyir.
  • göstərmək: Qrafiki göstərir.

Burada biz Axes obyektini dəyişən oxlara saxlayırıq. Baltaların üsullarını birbaşa çağırmaqla, biz yığılmış sahə diaqramı yaradırıq, başlıq təyin edirik, əfsanə əlavə edirik və y oxunun etiketini təyin edirik. Bu obyekt yönümlü yanaşmanın bir nümunəsidir. Bu çıxış qrafikidir:

Pin

Səpələnmə qrafiki və Histoqram:

Fiqurun çoxlu baltalardan ibarət olduğu daha bir nümunəyə baxaq. Burada diskret vahid paylamadan çəkilmiş iki korrelyasiya massivinin xəttini çəkəcəyik.

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(low=1, high=11, size=50)
y = x + np.random.randint(1, 5, size=x.size)
data = np.column_stack((x, y))
figure, (axes1, axes2) = plt.subplots(nrows=1, ncols=2,figsize=(8, 4))
axes1.scatter(x=x, y=y, marker='o', c='r', edgecolor='b')
axes1.set_title('Scatter: x versus y')
axes1.set_xlabel('x')
axes1.set_ylabel('y')
axes2.hist(data, bins=np.arange(data.min(), data.max()),label=('x', 'y'))
axes2.legend(loc=(0.65, 0.8))
axes2.set_title('Frequencies of x and y')
axes2.yaxis.tick_right()
plt.show()

Kod aşağıdakıları yerinə yetirir:

  • Burada parametrləri tək fiqur və iki oxlu alt xətlər yaradan subplots()-a ötürürük.
  • x və y dəyişənləri təsadüfi ədədlərlə doldurulmuş 1d massivindən ibarətdir.
  • Balta obyektlərini ayrıca idarə edirik. Bir ox obyekti ilə səpələnmə qrafiki və digər oxlar obyekti ilə histoqram yaradırıq.
  • tick_right(): Funksiya sağ tərəfdəki koordinasiyalı oxdakı nöqtələri göstərir.

Vəziyyətli yanaşma ilə iki ox obyektini ayrı-ayrılıqda idarə etmək çətindir. Çıxış qrafiki belə olacaq:

Pin

Scatter funksiyasındakı marker arqumenti öz istəyinizə uyğun olaraq dəyişə biləcəyiniz marker üslubunu müəyyən edir. Burada markeri 's' olaraq dəyişdiririk.

axes1.scatter(x=x, y=y, marker='s', c='r', edgecolor='b')

Dollar işarəsinin içərisinə mətn yerləşdirməklə mətni kursiv olaraq dəyişir.

axes1.set_title('$Scatter$: x versus y')
axes2.set_title('$Frequencies$ $of$ x $and$ y')

Çıxış belə olacaq:Pin

Daha əvvəl gördüyümüz kimi, şəklin özündən balta obyektlərini əldə edə bilərik.

>>> figure.axes[0] is axes1 and figure.axes[1] is axes2
True

m*n balta obyektlərinin şəbəkəsi:

Həmçinin, m*n şəbəkəsində balta obyektlərini ehtiva edən bir fiqur yarada bilərik. Belə nümunələrdən biri:

figure,axes=plt.subplots(nrows=2,ncols=2,figsize=(7,7))

Baltaların növünü yoxlasanız, o, artıq AxesSubplot deyil. Əvəzində, o, bir sıra var.

>>> type(axes)
<class 'numpy.ndarray'>
>>> axes
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0A4BBAD0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0D44F2B0>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0D4700F0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0D4952D0>]],
      dtype=object)
>>> axes.shape
(2, 2)

Numpy massivi sadəcə bir konteynerdir. Axes obyektlərinin hər birində biz plan qurma üsullarını çağırmalıyıq. AxesSubplot yazmaq üçün 2d Numpy massivini 4 obyektə çevirmək üçün yastılaşdırma metodundan istifadə edə bilərik.

axes1,axes2,axes3,axes4=axes.flatten()
>>> type(axes1)
<class 'matplotlib.axes._subplots.AxesSubplot'>

Bunu etmək üçün alternativ bir yol var. Ancaq əvvəlki üsul çevikdir.

((axes1,axes2),(axes3,axes4))=axes

>>> type(axes1)
<class 'matplotlib.axes._subplots.AxesSubplot'>

Təkmil alt süjet xüsusiyyətləri:

Bir nümunə ilə alt süjetin bəzi inkişaf etmiş xüsusiyyətlərini başa düşmək üçün anlayaq. Python kitabxanalarından io, urllib və tarfile istifadə edərək biz sıxılmış tar arxivindən Kaliforniyanın makroiqtisadi mənzil məlumatlarını çıxaracağıq.

import numpy as np
from io import BytesIO
import tarfile
from urllib.request import urlopen

url='https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz'
bytesio_object=BytesIO(urlopen(url).read())
file_path = 'CaliforniaHousing/cal_housing.data'
with tarfile.open(mode='r', fileobj=bytesio_object) as archive:
    housing = np.loadtxt(archive.extractfile(file_path), delimiter=',')

URL dəyişəni verilənləri ehtiva edən URL-dir. Yuxarıdakı kod məlumatı fayldan çıxarır və onu numpy massivində saxlayır.

Orta evin dəyərini, ərazinin əhalisini və orta evin yaşını əldə edək.

>>> avarage_home_value=housing[:,-1]
>>> population,age=housing[:,[4,7]].T

T atributu massivin köçürülməsindən başqa bir şey deyil.

Gəlin süjetin içinə mətn qutusu yerləşdirərək “süjet daxili başlıq” kimi fəaliyyət göstərən daha bir funksiya yazaq.

def add_titlebox(axes, text):
    axes.text(.55,.8,text,horizontalalignment='center',
        transform=ax.transAxes,bbox=dict(facecolor='white',alpha=0.6),
        fontsize=12.5)
    return axes

Biz alt süjeti matplotlib-in gridspec modulu ilə fərdiləşdirə bilərik. Biz pyplotun subplot2grid() ilə gridspec modulu ilə qarşılıqlı əlaqə qura bilərik. Yaradacağımız tərtibat budur:

Pin

Burada 3*2 ölçülü şəbəkəmiz var. ax1, ax2 və ax3-ün iki dəfə hündürlüyünə və eninə töhfə verir.

Pin

Subplot2grid()-ə biz (sətir, sütun) arqument kimi ötürürük, bu, baltalar obyektinin şəbəkədəki yerindən başqa bir şey deyil.

gridsize=(3,2)
figure=plt.figure(figsize=(12,8))
ax1=plt.subplot2grid(gridsize, (0, 0), colspan=2, rowspan=2)
ax2 = plt.subplot2grid(gridsize, (2, 0))
ax3 = plt.subplot2grid(gridsize, (2, 1))

İndi baltaların hər biri ilə ayrı-ayrılıqda məşğul ola bilərik.

ax1.set_title("Value of home as a function of age of home and population of area")
scatter=ax1.scatter(x=age,y=population,c=average_home_value,cmap='RdYlGn')
plt.colorbar(scatter,ax=ax1,format='$%d')
ax1.set_yscale('log')
ax2.hist(age,bins='auto')
ax3.hist(population,bins='auto',log=True)

add_titlebox(ax2,'Histogram: Age of the home')
add_titlebox(ax3, 'Histogram: Area population (log scl.)')

plt.show()

Rəng çubuğu metodu süjetə rəng zolağı əlavə edir. O, baltalarda deyil, birbaşa şəkildə çağırılır. O, arqument kimi ax1.scatter() alır, hansı ki, orta ev dəyərini ColorMap-ə uyğunlaşdırır.

Pin

Y oxu boyunca yuxarı və aşağı hərəkət etdikcə, rəngdə çox fərq yoxdur. Evin dəyərinin müəyyənləşməsində evin yaşının daha güclü rol oynadığını göstərir.

Şəkil:

Fiqur iki yolla yaradıla bilər:

  • plt.subplots() çağırılır
  • plt.figure() çağırılması heç bir oxları olmayan bir fiqur yaradır. Bu tez-tez istifadə edilmir.

Nə vaxt yeni bir fiqur yarada bilsək, matplotlib onu yaddaşda saxlayır. Biz cari rəqəm və cari oxlar anlayışını dövlət interfeysində gördük. Cari rəqəm və cari oxlar ən son yaradılanlardır və biz yaddaşda obyektin ünvanını göstərmək üçün id() daxili funksiyasından istifadə edə bilərik.

>>> figure1,axes1=plt.subplots()

>>> id(figure1)
162617520
>>> id(plt.gcf())
162617520

>>> figure2,axes2=plt.subplots()

>>> id(figure2)
203096944
#plt.gcf() returns the current figure
>>> id(figure2)==id(plt.gcf())
True
>>>

Ən son yaradılmış rəqəm cari rəqəmdir. Bu rəqəmlərin hər ikisi yaddaşdadır, hər birinə müvafiq ID ilə daxil olur. MATLAB üslubunda olduğu kimi, indeksləşdirmə 1 ilə başlayır.

>>> plt.get_fignums()
[1, 2]

plt.figure()-ni fignumların hər birinə uyğunlaşdırmaqla rəqəmi əldə edə bilərik.

>>> def get_all_figures():
...     return [plt.figure(i) for i in plt.get_fignums()]

>>> get_all_figures()

[<Figure size 640x480 with 1 Axes>,
 <Figure size 640x480 with 1 Axes>]

Bir sıra faylları açdığınız zaman yaddaş xətasının qarşısını almaq üçün onları bağlamaq lazımdır. plt.close() cari rəqəmi bağlayır, plt.close('all') hamısını bağlayır və plt.close(num) rəqəm nömrəsini bağlayır.

>>> plt.close('all')
>>> get_all_figures()
[]

imshow() və matshow():

imshow() və matshow() metodları çox istifadə olunan metodlardır. matshow() imshow()-un ətrafındakı sarğıdır. Bunlar ədədi massivi rəngli tor kimi vizuallaşdırmaq üçün istifadə olunur.

Numpy ilə iki müəyyən tor yaradaq.

array1=np.diag(np.arange(2,12))[::-1]
array1[np.diag_indices_from(array1[::-1])] = np.arange(2, 12)
array2 = np.arange(array1.size).reshape(array1.shape)

İndi biz massiv1 və massiv2-ni şəkil formatında təqdim edə bilərik. Lüğətin başa düşülməsindən istifadə edərək, biz gənələri və bütün ox etiketlərini söndürüb nəticəni tick_params() metoduna keçirəcəyik.

sides=('top','bottom','left','right')
nolabels={s: False for s in sides}
nolabels.update({'label%s' %s:False for s in sides})
>>> nolabels
{'top': False, 'bottom': False, 'left': False, 'right': False, 'labeltop': False, 'labelbottom': False, 
'labelleft': False, 'labelright': False}

İndi istifadə edərək şəbəkəni söndürəcəyik kontekst meneceri və hər bir oxda biz matshow() çağıracağıq. Nəhayət, texniki cəhətdən yeni oxlar olan rəng çubuğunu rəqəmin içərisinə qoyacağıq.

from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable

with plt.rc_context(rc={'axes.grid': False}):
    figure, (axes1, axes2) = plt.subplots(1, 2, figsize=(8, 4))
    axes1.matshow(array1)
    image=axes2.matshow(array2,cmap='RdYlGn_r')
    for axes in (axes1,axes2):
        axes.tick_params(axis='both',which='both',**nolabels)
    for i,j in zip(*array1.nonzero()):
        axes1.text(j,i,array1[i,j],color='white',ha='center',va='center')

    divider=make_axes_locatable(axes2)
    cax=divider.append_axes("right",size='5%',pad=0)
    plt.colorbar(image,cax=cax,ax=[axes1,axes2])
    figure.suptitle('Heatmaps with "Axes matshow"',fontsize=16)

    plt.show()

Pin

Pandalarla plan qurmaq:

Pandalar hiylə qurma üsulları ilə gəlir. Pandaların planlaşdırılması üsulları mövcud matplotlib zəngləri ətrafında sarğılardır.

Məsələn, Series və DataFrame-də Pandalardan istifadə etdiyimiz plot() metodu sadəcə plt.plot() ətrafında sarğıdır. Artıq bildiyimiz kimi, plt.plot() birbaşa olaraq cari rəqəmə və oxlara istinad edir, Pandalar da eyni şeyi izləyirlər. Başqa bir misal, Pandas Dataframe-in indeksində tarix varsa, Pandalar cari rəqəmi əldə etmək üçün gcf().autofmt_xdate() çağırır və o, həmçinin x oxunu avtomatik formatlaşdırır.

Bəzi kod nümunələri ilə bu anlayışları anlayaq. Birincisi, pip istifadə edərək pandaları quraşdırın.

pip install pandas
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

series=pd.Series(np.arange(5),index=list('abcde'))
axes=series.plot()

İndi biz Pandalarda AxesSubplot yaratdıq. Buna əmin olmaq üçün növü yoxlayın.

>>> type(axes)
<class 'matplotlib.axes._subplots.AxesSubplot'>
>>> id(axes)==id(plt.gca())
True

Matplotlib ilə pandalar:

Pandaların plotting üsullarını matplotlib zəngləri ilə qarışdırarkən daxili arxitekturanı başa düşmək daha yaxşıdır. Süjeti tərtib etdiyimiz bir nümunəni görəcəyik orta hərəkət çox izlənilən maliyyə vaxt seriyası. Biz Pandas seriyası yaratmağa və bunun üzərində plot() metodunu çağırmağa gedirik. Sonra biz onu matplotlib-in plt.gca() tərəfindən yaradılmış Oxları ilə fərdiləşdirəcəyik.

import matplotlib.transforms as mtransforms

url = 'https://fred.stlouisfed.org/graph/fredgraph.csv?id=VIXCLS'
vix = pd.read_csv(url, index_col=0, parse_dates=True, na_values='.',infer_datetime_format=True,squeeze=True).dropna()
mean_average=vix.rolling('90d').mean()
state = pd.cut(mean_average, bins=[-np.inf, 14, 18, 24, np.inf],labels=range(4))
cmap = plt.get_cmap('RdYlGn_r')
mean_average.plot(color='black', linewidth=1.5, marker='', figsize=(8, 4),label='VIX 90d MA')
axes = plt.gca()
axes.set_xlabel('')
axes.set_ylabel('90d moving average: CBOE VIX')
axes.set_title('Volatility Regime State')
axes.grid(False)
axes.legend(loc='upper center')
axes.set_xlim(xmin=mean_average.index[0], xmax=mean_average.index[-1])
trans = mtransforms.blended_transform_factory(axes.transData, axes.transAxes)
for i, color in enumerate(cmap([0.2, 0.4, 0.6, 0.8])):
    axes.fill_between(mean_average.index, 0, 1, where=state==i,facecolor=color, transform=trans)
axes.axhline(vix.mean(), linestyle='dashed', color='xkcd:dark grey',alpha=0.6, label='Full-period mean', marker='')

plt.show()

Kodun izahı:

  • Oxumaq CSV faylı qeyd olunan URL-dən və onu Pandas seriyasına çevirərək dəyişən vix-ə qənaət edin.
  • Rolling() funksiyası əsasən zaman seriyası məlumatlarında istifadə olunur. Rolling() funksiyası ilə yuvarlanan pəncərə hesablamalarını edə bilərik. Çox sadə sözlərlə desək, n ölçülü pəncərədə riyazi əməliyyatları bir anda yerinə yetiririk. Pəncərənin ölçüsü statistikanın hesablanması üçün istifadə olunan müşahidələrin sayını bildirir. Pəncərənin ölçüsü n olarsa, bir anda n ardıcıl dəyər deməkdir. Burada hər bir pəncərənin üzərindəki vix üzərində orta əməliyyat həyata keçiririk.
  • Kəsmə funksiyası verilənləri vedrələrə bölmək və çeşidləmək üçün istifadə olunur.
  • Biz plot() funksiyasını çağırırıq və açıq şəkildə cari Oxlara istinad edirik.
  • İkinci kod bloku hər bir vəziyyət kovasına uyğun rənglə dolu bloklar yaradır.cmap([0.2,04,0.6,0.8]) .Bu o deməkdir ki, “20, 40, 60 və 80-ci faizdə olan rənglər üçün ' ColorMaps' spektri boyunca bizə bir RGBA ardıcıllığı əldə edin."Hər bir RGBA rəngini dövlət nömrələməsi ilə əlaqələndirmək üçün () istifadə olunur.

Pin

Əlavə mövzular:

Konfiqurasiya və üslub:

Matplotlib-də siz müxtəlif süjetlər üzrə üslubu vahid şəkildə konfiqurasiya edə bilərsiniz. Bunu etməyin iki yolu var.

  • Matplotlibrc faylını fərdiləşdirin.
  • Konfiqurasiya parametrlərini ya .py skriptindən, ya da interaktiv şəkildə dəyişdirin.

Matplotlibrc faylı istifadəçinin fərdiləşdirilmiş parametrlərini ehtiva edən mətn faylıdır və sessiyalar arasında yadda saxlanıla bilər.

Biz həmçinin konfiqurasiya parametrlərini daha əvvəl qeyd edildiyi kimi interaktiv şəkildə dəyişə bilərik. Biz matplotlib.pyplot-u plt olaraq idxal etdiyimiz üçün rcParams-a daxil ola bilirik.

>>> [attr for attr in dir(plt) if attr.startswith('rc')]
['rc', 'rcParams', 'rcParamsDefault', 'rcParamsOrig', 'rc_context', 'rcdefaults', 'rcsetup']

'rc' ilə başlayan obyektlər süjet parametrləri və üslubları ilə qarşılıqlı əlaqə vasitəsidir.

plt.rcdefaults() rc parametrlərini reParamsDefault-da sadalanan standart dəyərlərlə əvəz edir. Bu, fərdiləşdirdiyiniz hər şeyi ləğv edir.

plt.rc() interaktiv parametrləri təyin etmək üçündür.

plt.rcParams() lüğətə bənzər obyektdir. Matplotlibrc fayllarında fərdiləşdirilmiş dəyişikliklər burada əks olunur. Siz həmçinin bu obyekti birbaşa dəyişə bilərsiniz.

# changing rc
plt.rc('lines', linewidth=2, color='g')

#Changing rcParams
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['lines.color'] = 'r'

Mövcud üslublara baxmaq üçün:

>>> plt.style.available
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot',
 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid',
 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 
 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

Stil təyin etmək üçün:

plt.style.use('fivethirtyeight')

İnteraktiv rejim:

Artıq qeyd edildiyi kimi, matplotlib müxtəlif arxa uçlarla qarşılıqlı əlaqədədir. Backend diaqramın göstərilməsində əsas işi görür. Bəzi arxa hissələr interaktivdir və hər dəfə dəyişdirildikdə istifadəçini göstərir.

Onun statusunu aşağıdakılarla yoxlaya bilərsiniz:

>>> plt.rcParams['interactive']
False

Siz həmçinin onu yandırıb/söndürə bilərsiniz:

>>> plt.ion()
>>> plt.rcParams['interactive']
True
>>> plt.ioff()
>>> plt.rcParams['interactive']
False

Bu interaktiv rejimin istifadəsi:

  • Diaqramı göstərmək üçün plt.show() istifadə etdik. İnteraktiv rejim aktivdirsə, bu funksiyaya ehtiyacımız yoxdur və biz onlara istinad etdikdə yenilənəcək.
  • İnteraktiv rejim söndürülübsə, diaqramı göstərmək üçün plt.show(), diaqramı yeniləmək üçün isə plt.draw() lazımdır.

'On' interaktiv rejimi ilə bir nümunə:

plt.ion()
array = np.arange(-4, 5)
array1 = array ** 2
array2 = 10 / (array ** 2 + 1)
figure, axes = plt.subplots()
axes.plot(array, array1, 'rx', array, array2, 'b+', linestyle='solid')
axes.fill_between(array, array1, array2, where=array2>array1, interpolate=True,color='green', alpha=0.3)
legend = axes.legend(['array1', 'array2'], loc='upper center', shadow=True)
legend.get_frame().set_facecolor('#ffb19a')

Pin

Translate »