具有离散颜色的2D阵列不适用于一个中间值

时间:2017-12-05 18:39:17

标签: python python-2.7 matplotlib

我有一个介于0和(包括)22之间的二维数组。 我希望每个值都有一个离散的颜色和悬浮值在普通的matshow图中分配给它。 我只使用Colormap和标准化来尝试它,但颜色15和16不一致。

没有任何标准化,15的颜色为16(当然悬停值是未对齐的浮点数)。 通过标准化,一切都很好,除了16的颜色为15。

我看到其他多个问题都在问同样的问题,但是按照答案导致了这个问题。

import matplotlib.pyplot as plt
import matplotlib.colors as colors

example_data = [list(range(23))]*4
cmaplist = [
    "#b3b3b3", "#333333", "#8a745c", "#8f7456",
    "#847362", "#1a53ff", "#336600", "#aa8a31",
    "#b3b3b3", "#aa8a31", "#aa8a31", "#004d00",
    "#aa8a31", "#5c330a", "#999999", "#66d9ff",
    "#e481a2", "#e996b1", "#e481a2", "#e06c92",
    "#e87da1", "#fff11c", "#ff6600"
]
norm = colors.BoundaryNorm(range(len(cmaplist)+1), len(cmaplist))
cmap = colors.LinearSegmentedColormap.from_list('mycmap', cmaplist, len(cmaplist))

plt.matshow(example_data, fignum=False, cmap=cmap, norm=norm)
plt.show()

我对matplotlib等不是很好,所以这可能是一个非常明显的错误。我正在对待它,就像它只是对数据进行简单的值查找一样,但我知道这并不是它的实际工作方式,但我不能用我有限的知识来思考更好的方法。

1 个答案:

答案 0 :(得分:1)

首先尝试创建MCVE:

import requests

payload = {'OPERATION-NAME': 'findItemsByProduct','productId.@type':'ReferenceID'}

req = requests.post(url, params=payload)

print(req.url)

enter image description here

可以看出,位置14和15处的颜色是相同的,而位置15应该是黄色。这存在于matplotlib 2.1中,在matplotlib 2.0.2中似乎没有问题。因此,我开了一个bug report

解决方案:

您要映射的数字(这里是整数)正好位于边界的边缘。我不确定这里出了什么问题,但是为了保存,你可以使用两个整数之间的中间作为边界,即

norm = colors.BoundaryNorm(np.arange(0,len(cmaplist)+1)-0.5, len(cmaplist))

完整示例:

import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np

example_data = np.array([list(range(20))]*4)
cmaplist = ["red", "limegreen", "blue", "gold"]*5

fig, ax = plt.subplots()

norm = colors.BoundaryNorm(np.arange(0,len(cmaplist)+1)-0.5, len(cmaplist))
cmap = colors.LinearSegmentedColormap.from_list('mycmap',cmaplist, len(cmaplist))

im = ax.matshow(example_data, cmap=cmap, norm=norm)

plt.show()

enter image description here