Jestem trochę zdezorientowany, co dzieje się na zapleczu, kiedy rysuję wykresy w matplotlib, tbh, nie jestem jasny z hierarchią działek, osi i figur. Przeczytałem dokumentację i była pomocna, ale nadal jestem zdezorientowany ...
Poniższy kod rysuje ten sam wykres na trzy różne sposoby -
#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)
Teraz moje pytanie brzmi -
Jaka jest różnica między wszystkimi trzema, mam na myśli to, co dzieje się pod maską, gdy wywoływana jest jedna z 3 metod?
Której metody należy użyć, kiedy i jakie są wady i zalety jej używania?
python
matplotlib
hashcode55
źródło
źródło
Odpowiedzi:
Metoda 1
Pozwala to narysować tylko jedną figurę ze współrzędnymi (x, y). Jeśli chcesz uzyskać tylko jedną grafikę, możesz użyć tego sposobu.
Metoda 2
Pozwala to na wykreślenie jednej lub kilku figur w tym samym oknie. W trakcie pisania narysujesz tylko jedną figurę, ale możesz zrobić coś takiego:
fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
Narysujesz 4 figury, które są nazwane ax1, ax2, ax3 i ax4, każda ale w tym samym oknie. To okno zostanie podzielone na 4 części z moim przykładem.
Metoda 3
fig = plt.figure() new_plot = fig.add_subplot(111) new_plot.plot(x, y)
Nie korzystałem z tego, ale możesz znaleźć dokumentację.
Przykład:
import numpy as np import matplotlib.pyplot as plt # Method 1 # x = np.random.rand(10) y = np.random.rand(10) figure1 = plt.plot(x,y) # Method 2 # x1 = np.random.rand(10) x2 = np.random.rand(10) x3 = np.random.rand(10) x4 = np.random.rand(10) y1 = np.random.rand(10) y2 = np.random.rand(10) y3 = np.random.rand(10) y4 = np.random.rand(10) figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) ax1.plot(x1,y1) ax2.plot(x2,y2) ax3.plot(x3,y3) ax4.plot(x4,y4) plt.show()
Inny przykład:
źródło
matplotlib
język był dla mnie zagmatwany, a to pytanie pojawia się podczas wyszukiwania informacji „osie kontra figura w matplotlib”. W przypadku innych noobów to pytanie pomogło odpowiedzieć na to pytanie. Myślę, że sformułowanie tutaj mogłoby być bardziej jasne, żesubplots()
zwróciAxes
obiekty na singlufigure
.Nazwy obiektów
Matplotlib jest silnie zorientowany obiektowo, a jego głównymi obiektami są figura i osie (nazwa
axes
jest trochę myląca, ale prawdopodobnie to tylko ja).Możesz myśleć o figurze jak o płótnie , którego zazwyczaj określasz wymiary i ewentualnie np. Kolor tła itp. Używasz płótna, figury , zasadniczo na dwa sposoby, umieszczając na niej inne obiekty (głównie osie , ale także etykiety tekstowe itp.) i zapisując jego zawartość z
savefig
.Można myśleć o osiach jako pewnego rodzaju szwajcarski scyzoryk, poręczny obiekt, który oferuje narzędzie (np
.plot
,.scatter
,.hist
etc) do wszystkiego, głównie. Możesz umieścić jedną, dwie, ... wiele osi wewnątrz figury, używając jednej z wielu różnych metod.plt
interfejsPLT interfejs proceduralny został pierwotnie opracowany do naśladowania ™ interfejs MATLAB, ale nie jest tak naprawdę różni się od interfejsu obiektowego, nawet jeśli nie robią bezpośrednie odniesienie do głównych obiektów (tj figura i an osie ) obiekty te są tworzone automatycznie i każda metoda plt jest zasadniczo tłumaczona na wywołanie jednej z metod podstawowych obiektów podstawowych: np. a
plt.plot()
jest ahidden_axes.plot
i aplt.savefig
jest ahidden_figure.savefig
.W każdej chwili możesz mieć uchwyt na te ukryte obiekty za pomocą
plt.gcf
iplt.gca
, co czasami jest konieczne, gdy jedna z metod obiektu nie została przeniesiona do metody w przestrzeni nazw plt .Chciałbym dodać, że przestrzeń nazw plt zawiera również szereg wygodnych metod tworzenia instancji, na różne sposoby, figury i osi .
Twoje przykłady
Tutaj używasz tylko interfejsu plt , możesz użyć tylko jednej osi na każdej figurze , ale właśnie tego chcesz, gdy eksplorujesz swoje dane, szybki przepis, który wykonuje pracę ...
Tutaj używasz wygodnej metody w przestrzeni nazw plt, aby nadać nazwę (i uchwyt) swojemu obiektowi axes , ale przy okazji jest też ukryta figura . Możesz później użyć obiektu axes do kreślenia, tworzenia histogramu itp. Wszystkich rzeczy, które możesz zrobić z interfejsem plt , ale możesz także uzyskać dostęp do wszystkich jego atrybutów i modyfikować je z większą swobodą.
Tutaj zaczynasz tworzenie instancji figury przy użyciu wygodnej metody w przestrzeni nazw plt, a później używasz tylko interfejsu obiektowego.
Możliwe jest ominięcie wygodnej metody plt (
matplotlib.figure.Figure
), ale musisz wtedy dostosować liczbę, aby uzyskać lepsze wrażenia z interakcji (w końcu jest to wygodna metoda).Osobiste rekomendacje
Proponuję gołe
plt.plot
,plt.scatter
w kontekście sesji interaktywnej, możliwie użycie IPythona z jego%matplotlib
magicznym poleceniem, a także w kontekście eksploracyjnego notatnika Jupyter.Z drugiej strony podejście obiektowe plus kilka
plt
wygodnych metod to droga do zrobieniaMiędzy tymi skrajnościami jest duża szara strefa i jeśli zapytasz mnie, co mam zrobić, powiedziałbym po prostu „To zależy” ...
źródło
fig, ax = plt.subplot()
idiomu, kiedy nie chcą wątków cząstkowych. W takich przypadkach łatwiej mi było zastosować styl „proceduralny”. "Ale prawdopodobnie to tylko ja ..." :-)