EDYTOWAĆ
Zmieniono aspect='normal
na, aspect='auto'
ponieważ zmieniło się to w nowszych wersjach matplotlib (dzięki @ Luke19).
Zakładając:
import matplotlib.pyplot as plt
Aby zrobić figurę bez ramy:
fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)
Aby treść wypełniła całą figurę
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
Następnie narysuj na nim swój obraz:
ax.imshow(your_image, aspect='auto')
fig.savefig(fname, dpi)
aspect
Parametr zmienia rozmiar obrazu, aby upewnić się, że wypełnienie wielkości liczbę wymienioną w fig.set_size_inches(…)
. Aby poczuć, jak bawić się tego typu rzeczami, przeczytaj dokumentację matplotlib , szczególnie na temat Axes, Axis i Artist.
w
ih
infig.set_size_inches(w,h)
idpi
parametr infig.savefig(fname, dpi)
tak, aby uzyskać 24 na 24 piksele, powinno działać dobrze. Na przykładw = h = 1
idpi = 24
imshow
, że składnia została zmieniona naaspect='auto'
zamiast'normal'
).ax = plt.Axes(fig, [0., 0., 1., 1.])
jest tym, co sprawia, że to działa.Wydaje się, że łatwiejszym rozwiązaniem jest:
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
źródło
fig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
Możesz znaleźć bbox obrazu wewnątrz osi (za pomocą
get_window_extent
) i użyćbbox_inches
parametru, aby zapisać tylko tę część obrazu:import numpy as np import matplotlib.pyplot as plt data=np.arange(9).reshape((3,3)) fig=plt.figure() ax=fig.add_subplot(1,1,1) plt.axis('off') plt.imshow(data) extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) plt.savefig('/tmp/test.png', bbox_inches=extent)
Nauczyłem się tej sztuczki od Joe Kingtona tutaj .
źródło
plt.axis('off')
pomogłem. Inne odpowiedzi niewiele pomagają.plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)
zamiastplt.savefig('/tmp/test.png', bbox_inches=extent)
Wypróbowałem kilka opcji w moim przypadku i najlepszym rozwiązaniem było to:
fig.subplots_adjust(bottom = 0) fig.subplots_adjust(top = 1) fig.subplots_adjust(right = 1) fig.subplots_adjust(left = 0)
następnie zapisz swoją figurę za pomocą
savefig
źródło
Zasugeruję odpowiedź herona13 z lekkim dodatkiem pożyczonym stąd, aby usunąć obicie pozostałe po ustawieniu bbox w tryb tight, dlatego:
axes = fig.axes() axes.get_xaxis().set_visible(False) axes.get_yaxis().set_visible(False) fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
źródło
Ten działa dla mnie
plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
źródło
Miałem ten sam problem podczas wykonywania wizualizacji w bibliotece librosa, gdzie chciałem wyodrębnić zawartość działki bez żadnych innych informacji. Więc to moje podejście. Odpowiedź unutbu pomaga mi również pracować.
figure = plt.figure(figsize=(500, 600), dpi=1) axis = plt.subplot(1, 1, 1) plt.axis('off') plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off') # your code goes here. e.g: I used librosa function to draw a image result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2]) librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r') extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted()) plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0) plt.close()
źródło
extent.get_points()*np.array([[1.1],[.9]])
.Dla każdego, kto próbuje to zrobić w Jupyter
plt.axis('off') spec = plt.imshow plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
źródło
Chociaż powyższe odpowiedzi dotyczą usuwania marginesów i dopełnienia, nie zadziałały one w przypadku usuwania etykiet. Oto, co zadziałało dla każdego, kto później natknie się na to pytanie:
Zakładając, że chcesz mieć siatkę 2x2 wykresów podrzędnych z czterech obrazów przechowywanych w
images
:matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require for i in range(4): ax = matplotlib.pyplot.subplot(2,2,i+1) ax.axis('off') imshow(images[i]) matplotlib.pyplot.savefig(path, bbox_inches='tight')
źródło
Próbowałem też pozbyć się granicy, używając tutaj wskazówek, ale nic tak naprawdę nie działało. Trochę się bawiąc i stwierdziłem, że zmiana koloru twarzy nie dawała mi żadnej granicy w laboratoriach jupyter (każdy kolor powodował pozbycie się białej ramki). Mam nadzieję że to pomoże.
def show_num(data): data = np.rot90(data.reshape((16,16)), k=3) data = np.fliplr(data) fig = plt.figure(frameon=False, facecolor='white') ax = plt.Axes(fig, [0., 0., 1., 1.]) ax.set_axis_off() fig.add_axes(ax) ax.imshow(data) plt.show()
źródło
Właściwie to ostatnio próbowałem i zamiast tych wszystkich linii możesz użyć
Działa jak marzenie. tylko jedna kwestia i problem rozwiązany.
Dokumentacja ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html )
źródło
Dla mnie ten kod sprawił, że rozmiar obrazu wejściowego bez ramki i osi z kodów matehat , unutbu i WHZW był podobny :
fig = plt.figure() ax = fig.add_subplot(1,1,1) plt.axis('off') viridis = cm.get_cmap('gist_gray', 256) plt.imshow(data, aspect='auto', cmap=viridis) plt.tight_layout() plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)
Środowisko wykonawcze:
Python 3.6.10
Matplotlib 3.2.1
OS Windows 10
źródło