我有一个介于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等不是很好,所以这可能是一个非常明显的错误。我正在对待它,就像它只是对数据进行简单的值查找一样,但我知道这并不是它的实际工作方式,但我不能用我有限的知识来思考更好的方法。
答案 0 :(得分:1)
首先尝试创建MCVE:
import requests
payload = {'OPERATION-NAME': 'findItemsByProduct','productId.@type':'ReferenceID'}
req = requests.post(url, params=payload)
print(req.url)
可以看出,位置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()