menambahkan plot garis ke imshow dan mengubah penanda sumbu

Saya telah membuat plot terlampir menggunakan kode berikut:

a = 1
theta = np.linspace(0,2*np.pi,101)
x = np.linspace(-3*a,3*a,1001, dtype='complex')
y = np.linspace(-3*a,3*a,1001, dtype='complex')
X,Y = np.meshgrid(x,y)

# come manipulations with V
# (same shape and type as X,Y) not shown here 

plt.subplot(1,2,1)
plt.scatter(a*np.cos(theta), a*np.sin(theta))
plt.imshow(V.real)
plt.colorbar()
plt.subplot(1,2,2)
plt.scatter(a*np.cos(theta), a*np.sin(theta))
plt.imshow(V.imag)
plt.colorbar()

Yang ingin saya lakukan adalah:

1) ubah skala plot sedemikian rupa sehingga sumbu horizontal dan vertikal bervariasi antara -3*a dan 3*a

2) gambarkan batas lingkaran (berpusat pada titik asal dengan jari-jari = a). Sekarang muncul di kiri atas, karena skala plot diubah dari [-3*a,3*a] menjadi ukuran array.masukkan deskripsi gambar di sini


person Physicist    schedule 30.12.2015    source sumber
comment
sudahkah Anda mempertimbangkan untuk menggunakan perintah xlim dan ylim? Saya pikir ini akan membantu Anda dengan masalah pertama   -  person Zachi Shtain    schedule 30.12.2015
comment
Itu tidak berhasil. Jika saya menggunakan xlim(-3,3), ylim(-3,3) maka hanya akan memperbesar pojok kiri atas dan menampilkan V[0:3,0:3]   -  person Physicist    schedule 30.12.2015
comment
apakah V itu gambar? sepertinya koordinat x dan y menggambarkan baris dan kolom suatu gambar   -  person Zachi Shtain    schedule 30.12.2015
comment
Tidak yakin apa definisi 'gambar', tapi V adalah array dengan bentuk 1001x1001.   -  person Physicist    schedule 30.12.2015
comment
Anda sedang mencari extent kwarg hingga imshow.   -  person Joe Kington    schedule 30.12.2015
comment
Anda juga dapat mempertimbangkan contourf(x, y, Z) yang merupakan kontur yang terisi.   -  person ssm    schedule 02.02.2016


Jawaban (1)


Secara umum, Anda mencari extent kwarg hingga imshow.

Sebagai contoh singkat:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((10, 10))

fig, ax = plt.subplots()
ax.imshow(data, extent=[10, 30, np.pi, -2*np.pi])
plt.show()

masukkan deskripsi gambar di sini

Dalam contoh yang Anda berikan:

import numpy as np
import matplotlib.pyplot as plt

a = 1
theta = np.linspace(0, 2*np.pi, 100)

# We could replace the next three lines with:
# y, x = np.mgrid[-3*a:3*a:1000j, -3*a:3*a:1000j]
x = np.linspace(-3*a, 3*a, 1000)
y = np.linspace(-3*a, 3*a, 1000)
x, y = np.meshgrid(x, y)

# Now let's make something similar to your V for this example..
r = np.hypot(x, y)
V = np.cos(3*np.arctan2(y, x)) + np.sin(r) + np.cos(x)*1j * np.cos(r)

def plot(ax, data):
    ax.plot(a*np.cos(theta), a*np.sin(theta), color='black')
    im = ax.imshow(data, extent=[x.min(), x.max(), y.max(), y.min()])
    fig.colorbar(im, ax=ax, shrink=0.5)

fig, (ax1, ax2) = plt.subplots(ncols=2)

ax1.set(title='Real Portion')
plot(ax1, V.real)

ax2.set(title='Imaginary Portion')
plot(ax2, V.imag)

plt.show()

masukkan deskripsi gambar di sini

Namun, Anda mungkin juga mempertimbangkan untuk menggunakan pcolormesh dalam kasus ini. Misalnya, kita dapat mengubah fungsi plot menjadi:

def plot(ax, data):
    ax.plot(a*np.cos(theta), a*np.sin(theta), color='black')
    im = ax.pcolormesh(x, y, data)
    ax.set(aspect=1)
    fig.colorbar(im, ax=ax, shrink=0.5)

Perbedaan utamanya adalah:

  1. imshow dapat melakukan interpolasi, sedangkan pcolormesh memberikan keluaran vektor dan tidak dapat melakukan interpolasi (yaitu memplot banyak persegi panjang, bukan gambar).
  2. pcolormesh agak lambat, jadi untuk gambar besar, imshow adalah pilihan yang lebih baik.
  3. imshow dan pcolormesh memperlakukan luasannya sedikit berbeda. imshow adalah "berpusat pada sel" sedangkan pcolormesh adalah "berpusat pada mesh". Ini adalah perbedaan setengah piksel, jadi Anda dapat mengabaikannya dalam kasus ini.
  4. imshow akan mengatur aspek plot menjadi 1, sehingga satu unit pada arah x sama besarnya dengan satu unit pada arah y. Ini juga membalik sumbu y, secara default.

Satu catatan lain: Jika Anda memilih untuk tidak membalik sumbu y, panggil ax.invert_yaxis() atau gunakan origin='lower' dan extent=[xmin, xmax, ymin, ymax].

person Joe Kington    schedule 30.12.2015