使用pcolor覆盖两个图

时间:2018-01-22 18:15:31

标签: python numpy matplotlib overlay

我想在同一图中绘制两个numpy数组Z1和Z2,在Z1顶部绘制Z2。数组Z2只包含0和1,我希望0是完全透明的(alpha = 0),1是透明的,有些是alpha> 0

这是代码和结果图像:

import numpy as np
import matplotlib.pyplot as plt

N = 10
x = np.arange(0, N)
y = np.arange(0, N)
Z1 = np.random.rand(N,N)
Z2 = np.ones((N, N))
Z2[0:N//2, 0:N] = 0

X, Y = np.meshgrid(x, y)
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8, 6))
plt.pcolormesh(X, Y, Z1, cmap=plt.cm.Blues)
plt.colorbar()
plt.pcolormesh(X, Y, Z2, cmap=plt.cm.Reds_r, alpha=0.3)
ax.set_xlabel(r'$x$', fontsize=22)
ax.set_ylabel(r'$y$', fontsize=22)
plt.show()

enter image description here

有两个问题:

  1. 不需要的网格线的外观

  2. 根据需要,Z2的0不完全透明

  3. 为了摆脱网格线,我们可以使用imshow而不是pcolor,但我真的想使用x和y的值。

1 个答案:

答案 0 :(得分:5)

使一些像素透明的最简单选择是根本不绘制它们。这可以通过将它们设置为NaN(不是数字)来完成。

import numpy as np
import matplotlib.pyplot as plt

N = 10
x = np.arange(0, N)
y = np.arange(0, N)
Z1 = np.random.rand(N,N)
Z2 = np.ones((N, N))
Z2[0:N//2, 0:N] = np.nan

X, Y = np.meshgrid(x, y)
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8, 6))
plt.pcolormesh(X, Y, Z1, cmap=plt.cm.Blues)
plt.colorbar()
plt.pcolormesh(X, Y, Z2, cmap=plt.cm.Reds, vmin=0,vmax=1,alpha=0.3)
ax.set_xlabel(r'$x$', fontsize=22)
ax.set_ylabel(r'$y$', fontsize=22)
plt.show()

enter image description here