我使用以下代码制作了附图:
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]变为数组大小。
答案 0 :(得分:6)
一般情况下,您正在寻找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]
。