所述
nans干扰
pcolor确定包含在值的范围
data,因为
In [72]: data.min(), data.max()Out[72]: (nan, nan)
您可以通过声明自己使用的值范围来解决此问题,
np.nanmin并
np.nanmax在以下位置找到最小和最大的非NaN值
data:
heatmap = ax.pcolor(data, cmap=plt.cm.seismic, vmin=np.nanmin(data), vmax=np.nanmax(data))
以来
In [73]: np.nanmin(data), np.nanmax(data)Out[73]: (0.025462800000000001, 0.97094435999999995)
import numpy as npimport matplotlib.pyplot as pltcolumn_labels = list('ABCDEFGH')row_labels = list('WXYZ')fig, ax = plt.subplots()data = np.array([[ 0.96753494, 0.52349944, 0.0254628 , 0.5104103 ], [ 0.07320069, 0.91278731, 0.97094436, 0.70533351], [ 0.30162006, 0.49068337, 0.41837729, 0.71139215], [ 0.19786101, 0.15882713, 0.59028841, 0.06242765], [ 0.51505872, 0.07798389, 0.58790067, 0.44782683], [ 0.68975694, 0.53535385, 0.15696023, 0.35641951], [ 0.66481995, 0.03576846, 0.9623601 , 0.96006395], [ 0.45865404, 0.50433582, 0.18182575, 0.35126449],])data[3,:] = np.nanheatmap = ax.pcolor(data, cmap=plt.cm.seismic, vmin=np.nanmin(data), vmax=np.nanmax(data))heatmap.cmap.set_under('black')bar = fig.colorbar(heatmap, extend='both')# put the major ticks at the middle of each cellax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)# want a more natural, table-like displayax.invert_yaxis()ax.xaxis.tick_top()ax.set_xticklabels(row_labels, minor=False)ax.set_yticklabels(column_labels, minor=False)plt.show()另一个选择基于JoeKington的解决方案是在
dataNaN处绘制带有阴影线的矩形补丁。
上面的示例显示,
pcolor具有NaN值的单元格中的颜色好像NaN都是非常负的数字。相反,如果你传递
pcolor一个 蒙面阵列
,
pcolor叶蒙版区域透明。因此,您可以在轴背景色块上绘制阴影
ax.patch,以在被遮罩的区域上显示阴影。
import numpy as npimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchescolumn_labels = list('ABCDEFGH')row_labels = list('WXYZ')fig, ax = plt.subplots()data = np.array([[ 0.96753494, 0.52349944, 0.0254628 , 0.5104103 ], [ 0.07320069, 0.91278731, 0.97094436, 0.70533351], [ 0.30162006, 0.49068337, 0.41837729, 0.71139215], [ 0.19786101, 0.15882713, 0.59028841, 0.06242765], [ 0.51505872, 0.07798389, 0.58790067, 0.44782683], [ 0.68975694, 0.53535385, 0.15696023, 0.35641951], [ 0.66481995, 0.03576846, 0.9623601 , 0.96006395], [ 0.45865404, 0.50433582, 0.18182575, 0.35126449],])data[3,:] = np.nandata = np.ma.masked_invalid(data)heatmap = ax.pcolor(data, cmap=plt.cm.seismic, vmin=np.nanmin(data), vmax=np.nanmax(data))# https://stackoverflow.com/a/16125413/190597 (Joe Kington)ax.patch.set(hatch='x', edgecolor='black')fig.colorbar(heatmap)# put the major ticks at the middle of each cellax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)# want a more natural, table-like displayax.invert_yaxis()ax.xaxis.tick_top()ax.set_xticklabels(row_labels, minor=False)ax.set_yticklabels(column_labels, minor=False)plt.show()如果您希望使用多种阴影线标记,例如对NaN说一种,对负值说另一种,那么您可以使用循环来添加阴影阴影的矩形:
import numpy as npimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchescolumn_labels = list('ABCDEFGH')row_labels = list('WXYZ')fig, ax = plt.subplots()data = np.array([[ 0.96753494, 0.52349944, 0.0254628 , 0.5104103 ], [ 0.07320069, 0.91278731, 0.97094436, 0.70533351], [ 0.30162006, 0.49068337, 0.41837729, 0.71139215], [ 0.19786101, 0.15882713, 0.59028841, 0.06242765], [ 0.51505872, 0.07798389, 0.58790067, 0.44782683], [ 0.68975694, 0.53535385, 0.15696023, 0.35641951], [ 0.66481995, 0.03576846, 0.9623601 , 0.96006395], [ 0.45865404, 0.50433582, 0.18182575, 0.35126449],])data -= 0.5data[3,:] = np.nandata = np.ma.masked_invalid(data)heatmap = ax.pcolor(data, cmap=plt.cm.seismic, vmin=np.nanmin(data), vmax=np.nanmax(data))# https://stackoverflow.com/a/16125413/190597 (Joe Kington)ax.patch.set(hatch='x', edgecolor='black')# draw a hatched rectangle wherever the data is negative# http://matthiaseisen.com/pp/patterns/p0203/mask = data < 0for j, i in np.column_stack(np.where(mask)): ax.add_patch( mpatches.Rectangle( (i, j), # (x,y) 1, # width 1, # height fill=False, edgecolor='blue', snap=False, hatch='x' # the more slashes, the denser the hash lines))fig.colorbar(heatmap)# put the major ticks at the middle of each cellax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)# want a more natural, table-like displayax.invert_yaxis()ax.xaxis.tick_top()ax.set_xticklabels(row_labels, minor=False)ax.set_yticklabels(column_labels, minor=False)plt.show()


