EDIT
Berubah aspect='normal
menjadi aspect='auto'
sejak itu berubah di versi matplotlib yang lebih baru (terima kasih kepada @ Luke19).
Asumsi :
import matplotlib.pyplot as plt
Untuk membuat sosok tanpa bingkai:
fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)
Untuk membuat konten mengisi seluruh gambar
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
Kemudian gambarlah gambar Anda di atasnya:
ax.imshow(your_image, aspect='auto')
fig.savefig(fname, dpi)
The aspect
parameter mengubah ukuran pixel untuk memastikan mereka mengisi ukuran angka yang ditetapkan dalam fig.set_size_inches(…)
. Untuk merasakan bagaimana bermain dengan hal-hal semacam ini, bacalah dokumentasi matplotlib , khususnya tentang subjek Axes, Axis dan Artist.
w
danh
parameter dalamfig.set_size_inches(w,h)
dandpi
parameter dalamfig.savefig(fname, dpi)
sehingga mengakibatkan 24px oleh 24px, itu harus bekerja dengan baik. Misalnya,w = h = 1
dandpi = 24
imshow
sintaksnya diubah menjadiaspect='auto'
bukan'normal'
).ax = plt.Axes(fig, [0., 0., 1., 1.])
adalah yang membuatnya berhasil.Solusi yang lebih mudah tampaknya:
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
sumber
fig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
Anda dapat menemukan bbox gambar di dalam sumbu (menggunakan
get_window_extent
), dan menggunakanbbox_inches
parameter untuk hanya menyimpan bagian gambar itu: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)
Saya belajar trik ini dari Joe Kington di sini .
sumber
plt.axis('off')
membantu. Jawaban lain tidak banyak membantu.plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)
alih-alihplt.savefig('/tmp/test.png', bbox_inches=extent)
Saya telah mencoba beberapa opsi dalam kasus saya, dan solusi terbaik adalah ini:
fig.subplots_adjust(bottom = 0) fig.subplots_adjust(top = 1) fig.subplots_adjust(right = 1) fig.subplots_adjust(left = 0)
lalu simpan gambar Anda dengan
savefig
sumber
Saya akan menyarankan jawaban heron13 dengan sedikit tambahan yang dipinjam dari sini untuk menghapus padding yang tersisa setelah mengatur bbox ke mode ketat, oleh karena itu:
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)
sumber
Yang ini berhasil untuk saya
plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
sumber
Saya memiliki masalah yang sama saat melakukan beberapa visualisasi menggunakan librosa di mana saya ingin mengekstrak konten plot tanpa informasi lain. Jadi ini pendekatan saya. jawaban unutbu juga membantu saya untuk bekerja.
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()
sumber
extent.get_points()*np.array([[1.1],[.9]])
.Untuk siapa saja yang mencoba melakukan ini di Jupyter
plt.axis('off') spec = plt.imshow plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
sumber
Sementara jawaban di atas membahas menghilangkan margin dan padding, mereka tidak berhasil untuk saya dalam menghapus label. Inilah yang berhasil, bagi siapa saja yang menemukan pertanyaan ini nanti:
Dengan asumsi Anda menginginkan petak subplot 2x2 dari empat gambar yang disimpan di
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')
sumber
Saya mencoba menyingkirkan perbatasan juga, menggunakan tip di sini tetapi tidak ada yang berhasil. Beberapa mengotak-atik dan saya menemukan bahwa mengubah warna wajah tidak memberi saya batas di laboratorium jupyter (Warna apa pun menghasilkan menghilangkan batas putih). Semoga ini membantu.
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()
sumber
Sebenarnya saya telah mencoba ini baru-baru ini dan alih-alih semua baris ini, Anda dapat menggunakan
Bekerja seperti pesona. hanya satu baris dan masalah terpecahkan.
Dokumentasi ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html )
sumber
Bagi saya, kode ini dibuat serupa dengan ukuran gambar input tanpa bingkai dan sumbu dari kode matehat , unutbu , dan WHZW :
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)
Lingkungan runtime:
Python 3.6.10
Matplotlib 3.2.1
OS Windows 10
sumber