我一直在尝试用 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工作......我无法分辨模式。
有没有办法删除它们,可能会强制热图的最终大小?
答案 0 :(得分: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)
这给了我们: