将线图添加到 imshow 并更改轴标记
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
关键字到 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
是 "cell-centered" 而 pcolormesh
是 "mesh-centered"。这是一个 half-pixel 差异,因此在这种情况下您可以忽略它。
imshow
会将绘图的纵横比设置为 1,因此 x-direction 中的一个单元与 y-direction 中的一个单元大小相同。默认情况下,它还会翻转 y-axis。
另一个注意事项:如果您不希望翻转 y-axis,请调用 ax.invert_yaxis()
或使用 origin='lower'
和 extent=[xmin, xmax, ymin, ymax]
。
我使用以下代码制作了附件图:
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
关键字到 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
是 "cell-centered" 而pcolormesh
是 "mesh-centered"。这是一个 half-pixel 差异,因此在这种情况下您可以忽略它。imshow
会将绘图的纵横比设置为 1,因此 x-direction 中的一个单元与 y-direction 中的一个单元大小相同。默认情况下,它还会翻转 y-axis。
另一个注意事项:如果您不希望翻转 y-axis,请调用 ax.invert_yaxis()
或使用 origin='lower'
和 extent=[xmin, xmax, ymin, ymax]
。