添加线图以显示和更改轴标记

时间:2015-12-30 13:30:15

标签: python matplotlib 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之间变化

2)绘制圆边界(以半径= a为中心的原点)。现在它出现在左上角,因为绘图的比例从[-3 * a,3 * a]变为数组大小。enter image description here

1 个答案:

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

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轴。
  5. 另一个注意事项:如果您不想翻转y轴,请拨打ax.invert_yaxis()或使用origin='lower'extent=[xmin, xmax, ymin, ymax]