Cara membuat subplot python imshow dengan ukuran piksel yang sama

Saya mencoba membuat subplot imshow dengan ukuran piksel yang sama tanpa menskalakan tinggi gambar secara otomatis, tetapi saya belum dapat menemukan caranya.

Idealnya, saya mencari plot yang mirip dengan gambar kedua, tanpa spasi tambahan (ylim mulai dari -0,5 hingga 4,5) dan mungkin dipusatkan secara vertikal. Gambar saya akan selalu memiliki lebar yang sama, jadi mungkin jika saya bisa memperbaiki lebar subplot daripada tingginya, itu akan membantu. Apakah ada yang punya ide?

close('all')
f,ax=subplots(1,2)
ax[0].imshow(random.rand(30,4),interpolation='nearest')
ax[1].imshow(random.rand(4,4),interpolation='nearest')
tight_layout()

f,ax=subplots(1,2)
ax[0].imshow(random.rand(30,4),interpolation='nearest')
ax[1].imshow(random.rand(4,4),interpolation='nearest')
ax[1].set_ylim((29.5,-0.5))
tight_layout()

Plot tanpa penyesuaian ylim:

Plot tanpa penyesuaian ylim

Plot dengan penyesuaian ylim:

Plot dengan penyesuaian ylim


person broccoli008    schedule 16.11.2018    source sumber


Jawaban (1)


Pada prinsipnya Anda cukup membuat ukuran gambar cukup kecil lebarnya, sehingga membatasi lebar subplot. Misalnya. figsize=(2,7) akan bekerja di sini.

Untuk solusi otomatis, Anda dapat menyesuaikan parameter subplot, sehingga margin kiri dan kanan membatasi lebar subplot. Ini ditunjukkan pada kode di bawah ini. Diasumsikan terdapat satu baris subplot, dan semua gambar memiliki jumlah piksel yang sama dalam arah horizontal.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1,2)
im1 = ax[0].imshow(np.random.rand(30,4))
im2 = ax[1].imshow(np.random.rand(4,4))


def adjustw(images, wspace="auto"):
    fig = images[0].axes.figure
    if wspace=="auto":
        wspace = fig.subplotpars.wspace
    top = fig.subplotpars.top
    bottom = fig.subplotpars.bottom
    shapes = np.array([im.get_array().shape for im in images])
    w,h = fig.get_size_inches()
    imw = (top-bottom)*h/shapes[:,0].max()*shapes[0,1] #inch
    n = len(shapes)
    left = -((n+(n-1)*wspace)*imw/w - 1)/2.
    right = 1.-left
    fig.subplots_adjust(left=left, right=right, wspace=wspace)

adjustw([im1, im2], wspace=1)

plt.show()

Jika Anda perlu menggunakan tight_layout(), lakukan sebelum memanggil fungsi tersebut. Anda juga pasti perlu menyetel satu-satunya parameter gratis di sini, wspace ke selain "auto". wspace=1 berarti memiliki jarak antar plot sebanyak lebarnya.

Hasilnya adalah gambar yang subplotnya memiliki ukuran lebar yang sama.

masukkan deskripsi gambar di sini

person ImportanceOfBeingErnest    schedule 16.11.2018
comment
Apakah Anda punya gambaran tentang bagaimana ini akan dimodifikasi ketika menggunakan ukuran gambar yang berbeda? Misalnya, mengubah baris ketiga menjadi fig, ax = plt.subplots(1,2,figsize=(40,30)) tampaknya menghasilkan subplot dengan ukuran piksel berbeda - person broccoli008; 19.11.2018
comment
Piksel di kedua subplot adalah sama, tidak bergantung pada ukuran gambar. Saya curiga jika Anda menggunakan figsize=(40,30) dan tidak mengubah dpi, itu akan menghasilkan angka yang terlalu besar untuk layar Anda, dalam hal ini jendela gambar menyusut ke ukuran layar dan semua nilai yang dihitung dengan baik menjadi tidak valid. - person ImportanceOfBeingErnest; 20.11.2018