Porównaj ceny domen i usług IT, sprzedawców z całego świata

Jak usunąć spacje między zagnieżdżonymi działkami w matplotlib?


Poniższy kod tworzy spacje między zagnieżdżonymi wykresami. Jak usunąć odstępy między zagnieżdżonymi wykresami i uczynić obraz gęstą siatką?
https://i.stack.imgur.com/uBn4j.png
import matplotlib.pyplot as pltfor i in range(16):
i = i + 1
ax1 = plt.subplot(4, 4, i)
plt.axis('on')
ax1.set_xticklabels([])
ax1.set_yticklabels([])
ax1.set_aspect('equal')
plt.subplots_adjust(wspace=None, hspace=None)
plt.show()

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Problem polega na funkcji
aspekt = 'equal'
, która zapobiega rozciągnięciu podpłaszczyzn do dowolnego współczynnika proporcji i wypełnieniu całej pustej przestrzeni.
Zwykle to zadziała:
import matplotlib.pyplot as pltax = [plt.subplot(2,2,i+1) for i in range(4)]for a in ax:
a.set_xticklabels([])
a.set_yticklabels([])plt.subplots_adjust(wspace=0, hspace=0)

Wynik jest taki:
https://i.stack.imgur.com/Wqj6o.png
Jednak z
aspekt = 'equal'
jak w poniższym kodzie:
import matplotlib.pyplot as pltax = [plt.subplot(2,2,i+1) for i in range(4)]for a in ax:
a.set_xticklabels([])
a.set_yticklabels([])
a.set_aspect('equal')plt.subplots_adjust(wspace=0, hspace=0)

Oto, co otrzymujemy:
https://i.stack.imgur.com/TQh97.png
Różnica w tym drugim przypadku polega na tym, że osie x i y mają tę samą liczbę jednostek/piksel, ponieważ osie domyślnie przechodzą od 0 do 1 (tj. Zanim cokolwiek wykreślisz). Używając
aspekt = ' equal '
wymuszasz, aby każda oś była kwadratowa. Ponieważ figura nie jest kwadratem, pyplot dodaje dodatkowe poziome odstępy między osiami.
Aby obejść ten problem, możesz dostosować kształt do prawidłowego współczynnika proporcji. Tutaj użyjemy zorientowanego obiektowo interfejsu pyplot, który ogólnie uważam za bardziej zaawansowany:
import matplotlib.pyplot as pltfig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]for a in ax:
a.set_xticklabels([])
a.set_yticklabels([])
a.set_aspect('equal')fig.subplots_adjust(wspace=0, hspace=0)

Oto wynik:
https://i.stack.imgur.com/tkcva.png
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz użyć

gridspec
http://matplotlib.org/api/gridspec_api.html
do kontrolowania odległości między osiami. Tutaj jest więcej szczegółów

Informacja
http://matplotlib.org/users/gridspec.html
.
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspecplt.figure(figsize = (4,4))
gs1 = gridspec.GridSpec(4, 4)
gs1.update(wspace=0.025, hspace=0.05) # set the spacing between axes. for i in range(16):
# i = i + 1 # grid spec indexes from 0
ax1 = plt.subplot(gs1[i])
plt.axis('on')
ax1.set_xticklabels([])
ax1.set_yticklabels([])
ax1.set_aspect('equal')plt.show()
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Bez uciekania się do

do
http://matplotlib.org/api/gridspec_api.html
gridspec całkowicie, możesz również użyć następujących opcji Aby usunąć spacje, ustawiając

wspace

i

hspace

równe zero:
import matplotlib.pyplot as pltplt.clf()
f, axarr = plt.subplots(4, 4, gridspec_kw = {'wspace':0, 'hspace':0})for i, ax in enumerate(f.axes):
ax.grid('on', linestyle='--')
ax.set_xticklabels([])
ax.set_yticklabels([])plt.show()
plt.close()

W rezultacie:
https://i.stack.imgur.com/2FZrm.png
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Czy próbowałeś już
plt.tight_layout ()
?
z
plt.tight_layout ()

bez niego:

Lub: coś takiego (użyj
add_axes
)
left=[0.1,0.3,0.5,0.7]
width=[0.2,0.2, 0.2, 0.2]
rectLS=[]
for x in left:
for y in left:
rectLS.append([x, y, 0.2, 0.2])
axLS=[]
fig=plt.figure()
axLS.append(fig.add_axes(rectLS[0]))
for i in [1,2,3]:
axLS.append(fig.add_axes(rectLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[4]))
for i in [1,2,3]:
axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[8]))
for i in [5,6,7]:
axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[12]))
for i in [9,10,11]:
axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))

Jeśli nie musisz udostępniać osi, po prostu
axLS = map (fig.add_axes, rectLS)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W przypadku ostatnich wersji matplotlib możesz spróbować

ograniczony układ
https://matplotlib.org/tutoria ... ml... Jednak to nie działa z
plt.subplot ()
, więc zamiast tego musisz użyć
plt.subplots ()
:
fig, axs = plt.subplots(4, 4, constrained_layout=True)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się