我想使用matplotlib的set_bad参数来为nan值指定一个特定的颜色。我创建了一个彩色地图:
from matplotlib.colors import ListedColormap, BoundaryNorm
cmap = ListedColormap(['green', 'yellow', 'red'])
norm = BoundaryNorm([0, 20, 70, 100], cmap.N)
然后我把坏颜色设为黑色:
cmap.set_bad(color="k")
为了验证一切正常工作,我绘制了一个数组作为测试,它可以工作(左下角是黑色的):
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
im = ax.imshow(np.array([[10, 50], [np.nan, 70]]), cmap=cmap, norm=norm)
fig.colorbar(im, ax=ax)
但是,如果我在集合上使用相同的颜色映射,它就无法工作:
from matplotlib.collections import LineCollection
lc = LineCollection(([(0.1, 0.1), (0.1, 0.2)], [(0.2, .2), (0.2, .3)], [(0.3, .3), (0.3, .4)]))
lc.set_cmap(cmap)
lc.set_norm(norm)
lc.set_array(np.array([10, np.nan, 80]))
fig, ax = plt.subplots()
ax.add_collection(lc)
plt.draw()
中线得到一个nan z值,应该是黑色的,但它是绿色的。在这种情况下,nan似乎被解释为0。
这是个窃听器还是故意的?有没有人知道是否有可能以不同的方式使用set_bad?
P.S.:我用matplotlib 2.2和3.0测试了它,结果是一样的
发布于 2018-09-26 01:04:10
如本期中所示并由@EdSmith注释,nan
s实际上并不是colormaps的有效输入。
相反,nan
在规范和颜色映射应用于ScalarMappable
之前被蒙蔽。对于Collection
,这种掩蔽需要手工完成。
.set_array(np.ma.masked_invalid([10., np.nan, 80.]))
完整的例子:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm
from matplotlib.collections import LineCollection
cmap = ListedColormap(['green', 'yellow', 'red'])
cmap.set_bad(color="k")
norm = BoundaryNorm([0, 20, 70, 100], cmap.N)
lc = LineCollection(([(0.1, 0.1), (0.1, 0.2)], [(0.2, .2), (0.2, .3)], [(0.3, .3), (0.3, .4)]))
lc.set_cmap(cmap)
lc.set_norm(norm)
lc.set_array(np.ma.masked_invalid([10., np.nan, 80.]))
fig, ax = plt.subplots()
ax.add_collection(lc)
plt.show()
https://stackoverflow.com/questions/52496817
复制相似问题