Ubah nilai pada sumbu grafik matplotlib imshow ()

90

Katakanlah saya memiliki beberapa data masukan:

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

Saya bisa memplotnya menggunakan imshow():

plt.imshow(hist,cmap='Reds')

mendapatkan:

masukkan deskripsi gambar di sini

Namun, nilai sumbu x tidak cocok dengan data masukan (yaitu rata-rata 100, berkisar dari 80 hingga 122). Oleh karena itu, saya ingin mengubah sumbu x untuk menunjukkan nilainya edges.

Saya telah mencoba:

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

dan

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

masukkan deskripsi gambar di sini

Adakah ide tentang bagaimana saya dapat mengubah nilai sumbu untuk mencerminkan data masukan yang saya gunakan?

atomh33ls
sumber
Gunakan pcoloralih-alih imshowseperti yang disebutkan dalam jawaban ini .
Nirmal

Jawaban:

144

Saya akan mencoba untuk menghindari mengubah xticklabelsjika mungkin, jika tidak, itu bisa sangat membingungkan jika Anda misalnya overplot histogram Anda dengan data tambahan.

Menentukan kisaran grid Anda mungkin yang terbaik dan imshowdengannya dapat dilakukan dengan menambahkan extentkata kunci. Dengan cara ini sumbu diatur secara otomatis. Jika Anda ingin mengubah label yang akan saya gunakanset_xticks dengan mungkin beberapa pemformat. Mengubah label secara langsung harus menjadi pilihan terakhir.

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

masukkan deskripsi gambar di sini

Rutger Kassies
sumber
18
Perlu juga dicatat bahwa interpolation="none"yang digunakan di sini, representasi data nyata yang jauh lebih akurat.
Ketagihan
4
Jawaban yang paling berguna; Saya telah menggunakannya untuk membuat plot warna dari fungsi dua variabel (yaitu, data seismik). Saya juga menambahkan opsi "aspek = 'otomatis'" di imshow () sehingga saya dapat 'meregangkan dan menekan' tampilan seismik.
Kurt Peek
11

Saya memiliki masalah serupa dan Google mengirim saya ke posting ini. Solusi saya sedikit berbeda dan kurang kompak, tapi semoga bisa bermanfaat bagi seseorang.

Menampilkan gambar Anda dengan matplotlib.pyplot.imshow umumnya merupakan cara cepat untuk menampilkan data 2D. Namun ini secara default memberi label sumbu dengan jumlah piksel. Jika data 2D yang Anda plot sesuai dengan beberapa kisi seragam yang ditentukan oleh larik x dan y, maka Anda dapat menggunakan matplotlib.pyplot.xticks dan matplotlib.pyplot.yticks untuk memberi label sumbu x dan y menggunakan nilai dalam larik tersebut. Ini akan mengaitkan beberapa label, sesuai dengan data kisi yang sebenarnya, dengan jumlah piksel pada sumbu. Dan melakukan ini jauh lebih cepat daripada menggunakan sesuatu seperti pcolor misalnya.

Berikut adalah upaya ini dengan data Anda:

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case
rxs
sumber