Beberapa subplot imshow, masing-masing dengan bilah warna

Saya ingin memiliki gambar yang terdiri dari, katakanlah, empat subplot. Dua di antaranya adalah plot garis biasa, dua di antaranya adalah gambar imshow.

Saya dapat memformat gambar imshow ke plot yang tepat, karena setiap gambar memerlukan bilah warna sendiri, sumbu yang dimodifikasi, dan sumbu lainnya dihapus. Namun, hal ini tampaknya sama sekali tidak berguna untuk subplot. Dapatkan seseorang menolong saya dengan itu?

Saya menggunakan ini untuk menampilkan data plot "biasa" di atas sebagai peta warna (dengan menskalakan array input i ke [ i, i, i, i, i, i ] untuk 2D dan memanggil imshow() dengannya).

Kode berikut pertama-tama menampilkan apa yang saya perlukan sebagai subplot dan yang kedua menunjukkan semua yang bisa saya lakukan, yang tidak cukup.

#!/usr/bin/env python

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm

s = { 't':1, 'x':[1,2,3,4,5,6,7,8], 'D':[0.3,0.5,0.2,0.3,0.5,0.5,0.3,0.4] }
width = 40

# how I do it in just one plot
tot = []
for i in range(width):
    tot.append(s['D'])

plt.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1))
plt.colorbar()
plt.axes().axes.get_xaxis().set_visible(False)
plt.yticks([0, 2, 4, 6], [s['x'][0], s['x'][2], s['x'][4], s['x'][6]])

plt.show()


f = plt.figure(figsize=(20,20))

plt.subplot(211)
plt.plot(s['x'], s['D'])
plt.ylim([0, 1])

#colorplot
sp = f.add_subplot(212)

#reshape (just necessary to see something)
tot = []
for i in range(width):
    tot.append(s['D'])

sp.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1))

    #what I can't do now but needs to be done:
    #sp.colorbar()
#sp.axes().axes.get_xaxis().set_visible(False)
#sp.yticks([0, 200, 400, 600, 800, 1000], [s['x'][0], s['x'][200], s['x'][400], s['x'][600], s['x'][800], s['x'][1000]])

plt.show()

person michael    schedule 16.08.2013    source sumber
comment
Contoh Anda tidak berjalan! Bisakah Anda menambahkan beberapa data sampel untuk s dan tot sehingga kami dapat melihat apa yang Anda lihat? Untuk kelengkapannya juga akan lebih baik jika setiap contoh diakhiri dengan perintah show.   -  person Steve Barnes    schedule 16.08.2013
comment
Maaf, saya telah menambahkan kode yang dapat dijalankan.   -  person michael    schedule 16.08.2013
comment
Anda tidak memerlukan semua perintah cla itu. Selain itu, saat memposting contoh, cara termudah adalah memplot data acak (kecuali masalahnya bergantung pada nilai pasti data tersebut).   -  person tacaswell    schedule 16.08.2013
comment
Harap kurangi kode ini hingga minimum yang diperlukan untuk menampilkan masalah Anda.   -  person tacaswell    schedule 16.08.2013
comment
Selesai. [beberapa surat untuk memenuhi min. persyaratan karakter]   -  person michael    schedule 16.08.2013


Jawaban (1)


Anda dapat menggunakan antarmuka berorientasi objek matplotlibs daripada antarmuka mesin-negara untuk mendapatkan kontrol yang lebih baik atas setiap sumbu. Selain itu, untuk mengontrol tinggi/lebar bilah warna, Anda dapat menggunakan AxesGrid toolkit dari matplotlib.

Misalnya:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.colors import LogNorm
from matplotlib.ticker import MultipleLocator

s = {'t': 1,
     'x': [1, 2, 3, 4, 5, 6, 7, 8],
     'T': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
     'D': [0.3, 0.5, 0.2, 0.3, 0.5, 0.5, 0.3, 0.4]}

width = 40

tot = np.repeat(s['D'],width).reshape(len(s['D']), width)
tot2 = np.repeat(s['T'],width).reshape(len(s['D']), width)

fig, (ax1, ax2, ax3, ax4) = plt.subplots(1,4)

fig.suptitle('Title of figure', fontsize=20)

# Line plots
ax1.set_title('Title of ax1')
ax1.plot(s['x'], s['T'])
ax1.set_ylim(0,1)

ax2.set_title('Title of ax2')
ax2.plot(s['x'], s['D'])
# Set locations of ticks on y-axis (at every multiple of 0.25)
ax2.yaxis.set_major_locator(MultipleLocator(0.25))
# Set locations of ticks on x-axis (at every multiple of 2)
ax2.xaxis.set_major_locator(MultipleLocator(2))
ax2.set_ylim(0,1)

ax3.set_title('Title of ax3')
# Display image, `aspect='auto'` makes it fill the whole `axes` (ax3)
im3 = ax3.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1), aspect='auto')
# Create divider for existing axes instance
divider3 = make_axes_locatable(ax3)
# Append axes to the right of ax3, with 20% width of ax3
cax3 = divider3.append_axes("right", size="20%", pad=0.05)
# Create colorbar in the appended axes
# Tick locations can be set with the kwarg `ticks`
# and the format of the ticklabels with kwarg `format`
cbar3 = plt.colorbar(im3, cax=cax3, ticks=MultipleLocator(0.2), format="%.2f")
# Remove xticks from ax3
ax3.xaxis.set_visible(False)
# Manually set ticklocations
ax3.set_yticks([0.0, 2.5, 3.14, 4.0, 5.2, 7.0])

ax4.set_title('Title of ax4')
im4 = ax4.imshow(tot2, norm=LogNorm(vmin=0.001, vmax=1), aspect='auto')
divider4 = make_axes_locatable(ax4)
cax4 = divider4.append_axes("right", size="20%", pad=0.05)
cbar4 = plt.colorbar(im4, cax=cax4)
ax4.xaxis.set_visible(False)
# Manually set ticklabels (not ticklocations, they remain unchanged)
ax4.set_yticklabels([0, 50, 30, 'foo', 'bar', 'baz'])

plt.tight_layout()
# Make space for title
plt.subplots_adjust(top=0.85)
plt.show()

masukkan deskripsi gambar di sini


Anda dapat mengubah lokasi dan label tanda centang pada salah satu sumbu dengan metode set_ticks dan set_ticklabels seperti pada contoh di atas.


Mengenai fungsi make_axes_locatable, dari situs matplotlib tentang toolkit AxesGrid:

Modul axes_divider menyediakan fungsi pembantu make_axes_locatable, yang dapat berguna. Dibutuhkan instance sumbu yang ada dan membuat pembagi untuknya.

ax = subplot(1,1,1)
divider = make_axes_locatable(ax)

make_axes_locatable mengembalikan turunan kelas AxesLocator, yang berasal dari Locator. Ini menyediakan metode append_axes yang membuat sumbu baru di sisi tertentu (“atas”, “kanan”, “bawah” dan “kiri”) dari sumbu asli.

person sodd    schedule 16.08.2013
comment
stackoverflow.com/questions/14254379/ ‹- memasukkan jawaban saya ke mesin status vs OO - person tacaswell; 16.08.2013
comment
Apa sebenarnya yang dilakukan make_axis_locatable? - person michael; 17.08.2013
comment
Selain itu, saya perlu menyesuaikan yticks dari gambar itu sendiri sedemikian rupa sehingga saat ini yticks tersebut adalah indeks bidang, tetapi mereka mewakili rentang tertentu dalam bentuk bin, jadi saya ingin menulis ini di sumbu, bukan indeks. Apakah ada cara untuk mengganti yticks? - person michael; 17.08.2013
comment
@michael Jika saya memahami komentar terakhir Anda dengan benar, Anda mencari metode set_ticklabels. Saya telah menggunakan ini di contoh (sumbu paling kanan). Anda dapat memberikan daftar label yang diinginkan pada metode ini. Jika daftarnya lebih pendek dari jumlah centang (seperti dalam contoh saya), label centang yang tersisa adalah string kosong, yaitu tidak ditampilkan. - person sodd; 17.08.2013
comment
Sempurna, sepertinya aku menginginkannya sekarang. Terima kasih (dan maaf atas keterlambatan menjawab). - person michael; 28.08.2013