matplotlib中的pcolor

1 投票
1 回答
773 浏览
提问于 2025-04-17 04:22

我在使用matplotlib里的pcolor功能。我的输入是一个三维数组。我想把第三个数组的显示方式设置成对数刻度。请问有没有这样的选项?如果我在绘图之前对第三个数组取对数,数组中小于1的值就会变成负数,这样pcolor就无法正常工作了。

1 个回答

0

假设你第三维的数据都是正数(因为负数的对数是没有定义的),那么用 pcolor 来绘图应该不会有问题(注意:Matplotlib 的文档推荐使用 pcolormesh,而不是 pcolor)。在这里,我想提一下这个帖子编辑的历史,之前“sub one”是写成“subzero”,这会导致出现 NaN;我稍后会再讲这个。现在的版本提到,任何小于1(但大于0)的数的对数都是负数。你提到在用 pcolor 绘制负数时遇到问题,但这应该不会影响任何事情。

假设都是正数,下面的代码应该可以正常工作。

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,正如之前提到的。将我们的 Z 定义改为 Z = X**2 - Y + 0.1,我们会收到一个警告。

RuntimeWarning: invalid value encountered in log
  p = ax.pcolor(data[0], data[1], np.log(data[2]))

这仍然会生成一个图,但数据为 NaN 的位置不会被绘制出来。

版本信息:

  • Python: 3.10.9
  • Matplotlib: 3.7.0
  • NumPy: 1.23.5

撰写回答