使用 pcolor 叠加两个绘图

3
我希望在同一张图中绘制两个numpy数组Z1和Z2,其中Z2在Z1的上方。数组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()

在这里输入图片描述

有两个问题:

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

  2. Z2的0不完全透明,需要更改

为了去掉网格线,我们可以使用imshow代替pcolor,但我真的想使用x和y的值。


2
相关: https://dev59.com/gGIj5IYBdhLWcg3wERJx - tmdavison
1个回答

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


我遇到了错误:"cbook._putmask(xa, xa < 0.0, -1) FloatingPointError: invalid value encountered in less"。但是,这仍然没有解决网格线的问题。 - Andreas K.
你正在使用哪个版本的matplotlib? - ImportanceOfBeingErnest
我之前使用的是2.0.2版本。安装了最新版本后问题解决了,谢谢!但是网格线仍然存在。 - Andreas K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接