如何在Matplotlib中的colormesh图上绘制图像?

时间:2018-10-29 23:33:48

标签: python matplotlib

我想绘制bool密度

plt.imshow(rectangle, extent=extent, cmap=ListedColormap([[1, 1, 1, 0], [0, 0, 0, 1]]))

在色网上

plt.pcolormesh(x_ticks, y_ticks, np.transpose(potential))

该怎么做?

尽管我有其他期望,但目前我仅看到第一幅图。


这是示例代码:

import matplotlib
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import numpy as np

x_ticks = np.linspace(-10, 10, 100, dtype=np.float32)
y_ticks = np.linspace(-10, 10, 100, dtype=np.float32)

x, y = np.meshgrid(x_ticks, y_ticks, indexing='ij')

# density plot of some circular function
r = np.sqrt(x ** 2 + y ** 2)
z = np.where(r != 0, np.sin(r) / r, 1)

plt.figure(1)
plt.pcolormesh(x_ticks, y_ticks, z)
plt.show()

# image of rectangle, white color is transparent
rectangle = np.logical_and(np.abs(x) < 2,  np.abs(y) < 2)
extent = [x_ticks[0], x_ticks[-1], y_ticks[0], y_ticks[-1]]

plt.figure(2)
plt.imshow(rectangle, extent=extent, cmap=ListedColormap([[1, 1, 1, 0], [0, 0, 0, 1]]))
plt.show()

# now I want both on the same plot superimposed
plt.figure(3)
plt.pcolormesh(x_ticks, y_ticks, z)
plt.imshow(rectangle, extent=extent, cmap=ListedColormap([[1, 1, 1, 0], [0, 0, 0, 1]]))
plt.show()

我得到这个:

enter image description here

但是我希望这样(在Photoshop中绘制):

enter image description here

2 个答案:

答案 0 :(得分:1)

您必须在一个绘图调用中设置一个明确的zorder才能将其放在顶部/底部:

plt.pcolormesh(x_ticks, y_ticks, z)
plt.imshow(rectangle, extent=extent, cmap=ListedColormap([[1, 1, 1, 0], [0, 0, 0, 1]]), zorder=1)

result

答案 1 :(得分:1)

安德拉的答案当然是正确的。如果您也使用extent来绘制矩形,则可以稍微简化代码并忽略zorderpcolormesh关键字:

plt.pcolormesh(x_ticks, y_ticks, z)
plt.pcolormesh(x_ticks, y_ticks, rectangle,cmap=ListedColormap([[1, 1, 1, 0], [0, 0, 0, 1]]))

通过这种方式,您立即知道坐标系是什么(zrectangle必须具有相同的形状)。