[英]adding line plot to imshow and changing axis marker
我使用以下代碼制作了附圖:
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之間變化
2)繪制圓邊界(以半徑= a為中心的原點)。 現在它出現在左上角,因為繪圖的比例從[-3 * a,3 * a]變為數組大小。
在一般情況下,你正在尋找的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()
在您給出的示例的情況下:
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()
但是,您也可以考慮在這種情況下使用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)
主要區別是:
imshow
可以插值,而pcolormesh
提供矢量輸出並且不能插值(即它繪制了許多矩形而不是圖像)。 pcolormesh
有點慢,所以對於大圖像, imshow
是更好的選擇。 imshow
和pcolormesh
略微區別對待范圍。 imshow
是“以細胞為中心”,而pcolormesh
是“以網格為中心”。 這是半像素差異,因此在這種情況下您可以忽略它。 imshow
將繪圖的方面設置為1,使得x方向上的一個單位與y方向上的一個單位的大小相同。 它默認也會翻轉y軸。 另一個注意事項:如果你不想讓y軸翻轉,可以調用ax.invert_yaxis()
或使用origin='lower'
和extent=[xmin, xmax, ymin, ymax]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.