Причина, по которой ваши значения NaN
не отображаются, состоит в том, что разброс matplotlib в настоящее время отфильтровывает их перед передачей их в карту цветов.
Для отображения записей NaN
вы можете вручную назначить им фиктивное значениес особым смыслом.Например, поскольку ваш список находится в диапазоне [0, 1]
, вы можете определить, что любое значение > 1
получает специальный цвет.Для этого вам нужно будет зафиксировать диапазон цветовой оси и указать цвет для записей за пределами этого диапазона (в данном случае выше максимального).
В основном вы будете использовать:
cax = ax.scatter(...)
cax.cmap.set_over('y') # assigns yellow to any entry >1
cax.set_clim(0, 1) # fixes the range of 'normal' colors to (0, 1)
Для вашего примера:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
numPoints = 20
nanFrequency = 3
xVec = np.arange(numPoints, dtype=float)
yVec = xVec
colorVec = np.linspace(0,1,numPoints)
colorVec[range(0, numPoints, nanFrequency)] = np.NaN
cmap = mpl.colors.LinearSegmentedColormap.from_list("Blue-Red-Colormap", ["b", "r"], numPoints)
# ---
fig, axes = plt.subplots(nrows=2, figsize=(8, 2*6))
# ---
ax = axes[0]
ax.scatter(xVec, yVec, c=colorVec, cmap=cmap)
ax.set_xlim([0, 20])
ax.set_ylim([0, 20])
# ---
ax = axes[1]
colorVec[np.isnan(colorVec)] = 2.0
cax = ax.scatter(xVec, yVec, c=colorVec, cmap=cmap)
cax.cmap.set_over('y')
cax.set_clim(0, 1)
ax.set_xlim([0, 20])
ax.set_ylim([0, 20])
# ---
plt.show()
, который создает два вспомогательных участка: верхний соответствует тому, что у вас было, нижний использует фиктивное значение и присваивает ему желтый:
