2015-12-30 155 views
2

我曾嘗試使用下面的代碼進行的附加劇情:將線圖來imshow和不斷變化的軸標記

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() 

我想要做的是:

1)改變劇情的規模使得水平和垂直軸在-3 * a和3 *之間變化a)繪製圓邊界(以半徑= a爲中心在原點處)。現在它出現在左上角,因爲繪圖的比例從[-3 * a,3 * a]更改爲數組大小。 enter image description here

+0

你有沒有考慮過使用xlim和ylim命令?我認爲它應該可以幫助你解決第一個問題 –

+0

這是行不通的。如果我使用xlim(-3,3),ylim(-3,3),那麼它只會放大到左上角並顯示V [0:3,0:3] – Physicist

+0

是V圖像嗎?它看起來像x和y座標描述圖像的行和列 –

回答

3

一般而言,您正在尋找extent kwarg至imshow

作爲一個簡單的例子:

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() 

enter image description here

在你給的例子的情況下:

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() 

enter image description here

不過,你也可以考慮使用pcolormesh在這種情況下。例如,我們可以改變plot功能:

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) 

的主要區別是:

  1. imshow可以插值,而pcolormesh給矢量輸出,不能插值(也就是它繪製了大量的矩形而不是圖像)。
  2. pcolormesh速度稍慢,所以對於大圖像,imshow是更好的選擇。
  3. imshowpcolormesh對區域的處理略有不同。 imshow是「以細胞爲中心」,而pcolormesh是「以網格爲中心」。這是一個半像素的差異,所以你可以在這種情況下忽略它。
  4. imshow將設置繪圖的方面爲1,以使x方向上的一個單位與y方向上的一個單位具有相同的尺寸。它也會翻轉y軸,默認情況下。其他

一個注意:如果你不希望有y軸翻轉,或者調用ax.invert_yaxis()或使用origin='lower'extent=[xmin, xmax, ymin, ymax]