NaN值作为pyplot散点图中的特殊颜色

时间:2019-05-03 08:31:29

标签: python-3.x matplotlib

我有一个(x,y)-散点图,其中每个点都与一种颜色关联。但是,某些点没有有效的颜色,而是被指定为NaN。我想包括这些点,但是要用颜色图未包含的颜色来显示它们。

这是示例代码:

import numpy as np
import matplotlib.colors as mcol
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

colormap = mcol.LinearSegmentedColormap.from_list("Blue-Red-Colormap", ["b", "r"])

plt.scatter(xVec, yVec, c=colorVec, cmap=colormap)

以及相应的输出: Scatter plot not showing points with invalid color

由于其无效的颜色值,因此未显示第三点。根据我的代码,我希望这些点以黄色显示。为什么这行不通?

请注意,这里有一个related post concerning imshow(),上面的代码是从中得到启发的。那里提出的解决方案似乎对我不起作用。

非常感谢。

2 个答案:

答案 0 :(得分:2)

当然,您需要为色图colormap.set_bad("yellow")设置所需的黄色。

然后,这是matplotlib(#4354)中一个由来已久的错误,所幸已修复(#12422)。

因此,从matplotlib 3.1开始,您可以使用plotnonfinite=True参数在散点图中包含被遮罩的点或无效点。

import numpy as np
import matplotlib.colors as mcol
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

colormap = mcol.LinearSegmentedColormap.from_list("Blue-Red-Colormap", ["b", "r"])
colormap.set_bad("yellow")

plt.scatter(xVec, yVec, c=colorVec, cmap=colormap, plotnonfinite=True)

plt.show()

enter image description here

答案 1 :(得分:1)

未绘制您的python值的原因是,matplotlib的散布图目前已将其过滤,然后再将其提供给颜色图。

要显示DEF_map = {} with open('in.txt') as file: for line in file.readlines()[1:]: s = line.split() if s[1] not in DEF_map: DEF_map[s[1]] = [] DEF_map[s[1]].append(float(s[3])) print("DEF Average of LMN") for DEF, LMN_list in DEF_map.items(): print("{}\t{}".format(DEF, sum(LMN_list)/len(LMN_list))) 条目,可以手动为它们分配一个具有特殊含义的伪值。例如,由于列表在NaN范围内,因此可以定义任何值NaN都具有特殊的颜色。为此,您将必须固定色轴的范围,并为该范围之外的条目指定一种颜色(在这种情况下,该颜色要比最大值更大)。

基本上,您将使用:

[0, 1]

例如:

> 1

哪个会生成两个子图:顶部与您所拥有的子图对应,底部使用虚拟值并为其分配黄色:

enter image description here