pcolormesh 添加了空白列

4 投票
1 回答
2190 浏览
提问于 2025-04-18 18:05

我一直在尝试用 pcolormesh 制作一个简单的热图,但遇到了一些奇怪的情况,有些尺寸会出现空白的白色列。如果我创建一个 10x30 的热图,如下所示,它就能正常工作。

from matplotlib import pyplot as plt 
import numpy as np

d = []
for x in range(10):
    d.append([])
    for y in range(30):
        d[-1].append(y)

plt.pcolormesh(np.array(d))
plt.show()

但是,如果我尝试创建一个 10x37 的热图:

from matplotlib import pyplot as plt 
import numpy as np

d = []
for x in range(10):
    d.append([])
    for y in range(34):
        d[-1].append(y)

plt.pcolormesh(np.array(d))
plt.show()

我发现最后出现了一些奇怪的白色列。这种情况在某些值上也会出现(比如 10x11 不行,但 10x12 可以……我没能找出规律。

10x37 的结果

有没有办法去掉这些白色列,或者强制设置热图的最终尺寸呢?

1 个回答

5

在坐标轴的限制和比例方面,pcolormesh 更像是一个折线图,而不是一张图片。如果你想把数组的元素显示成像素,可以使用 imshow。另外,你也可以设置 pcolormesh 图的 x 轴范围。看看下面这个例子:

from matplotlib import pyplot as plt 
import numpy as np

d1 = []
d2 = []
for x in range(10):
    d1.append([])
    d2.append([])
    for y in range(30):
        d1[-1].append(y+x)

    for y in range(37):
        d2[-1].append(y+x)



fig, axes = plt.subplots(ncols=4, figsize=(10,4))

# your first two examples
axes[0].pcolormesh(np.array(d1), cmap=plt.cm.coolwarm)
axes[1].pcolormesh(np.array(d2), cmap=plt.cm.coolwarm)

# let's reset the x-lims on this
axes[2].pcolormesh(np.array(d2), cmap=plt.cm.coolwarm)
axes[2].set_ylim(bottom=0, top=d2.shape[0])
axes[2].set_xlim(left=0, right=d2.shape[1])
# or more concisely (thanks Joe): 
axes[2].axis('tight')

# and use imshow here
axes[3].imshow(np.array(d2), cmap=plt.cm.coolwarm)

这样就得到了:

enter image description here

撰写回答