import numpy as np
import matplotlib.pyplot as plt
plt.close("all")
N = 20
x = np.linspace(0, 1, N)
y = np.linspace(0, 1, N)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y + 0.1
data = np.stack((X, Y, Z), axis=0)
fig, ax = plt.subplots()
p = ax.pcolor(data[0], data[1], np.log(data[2]))
fig.colorbar(p, ax=ax, label="ln(z)")
ax.set_xlabel("x")
ax.set_ylabel("y")
如果我们考虑原文,使用np.log作为负数将产生NaN s,如前所述。将我们的Z定义切换到Z = X**2 - Y + 0.1,我们将得到一个警告。
RuntimeWarning: invalid value encountered in log
p = ax.pcolor(data[0], data[1], np.log(data[2]))
1条答案
按热度按时间n8ghc7c11#
假设第三维的数据都是正的(因为负数的对数是未定义的),那么使用
pcolor
绘制这个图应该没有任何问题(注意:Matplotlib文档推荐使用pcolormesh
而不是pcolor
)。在这一点上,我将提请注意帖子的编辑历史,其中显示“sub one”用于表示“subzero”,这将产生NaN
s;我稍后再谈。正如当前版本所说,小于1(大于0)的数字的对数是负数。您提到使用pcolor
绘制负数时存在问题,但这应该不会影响任何内容。假设是正数,下面的代码应该可以工作。
如果我们考虑原文,使用
np.log
作为负数将产生NaN
s,如前所述。将我们的Z
定义切换到Z = X**2 - Y + 0.1
,我们将得到一个警告。这仍然会生成一个图,但不会绘制数据为
NaN
的位置。版本: