我对Python很新,甚至我已经做了相当深入和长期的研究我认为在github上打开一个案例之前我需要社区的确认。
我正在绘制两个"hinton plots",但我使用颜色范围来表示矩阵值。
出于某种原因使用子图绘制最后一个子图中的第一个图的背景,第一个mymap
颜色(在我的情况下为蓝色)。如果在任何情况下都覆盖set_facecolor = 'gray'
(即使我在绘图后设置了背景颜色)。此外,我发现仅当matrix
值大于0时才会产生此错误。
请参阅下面的图片(和图片说明)和代码。
第二个子图上第一张图片的背景为蓝色。 第三个子图添加了没有数据,现在它是蓝色的,第二个子图的第一个方块不是。
对于第一张图片结果,将第6行更改为:fig, (axe_1, axe_2) = plt.subplots(1,2)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
fig, (axe_1, axe_2, axe_3) = plt.subplots(1, 3)
my_min, my_max = (0, 10)
step = 1
mymap = mpl.colors.LinearSegmentedColormap.from_list("my list", ['blue','red'])
levels = range(my_min, my_max+step, step)
matrix = [None, None]
matrix[0] = np.asanyarray([[0, 1, 2], [3, 0, 5], [6, 7, 0]])
matrix[1] = np.asanyarray([[0, 9, 8], [7, 0, 6], [5, 4, 0]])
for iter, item in enumerate([axe_1, axe_2]):
item.patch.set_facecolor('gray')
item.set_aspect('equal', 'box')
item.xaxis.set_major_locator(plt.NullLocator())
item.yaxis.set_major_locator(plt.NullLocator())
Z = [[0, 0], [0, 0]]
CS3 = plt.contourf(Z, levels, cmap=mymap)
for (x, y), z in np.ndenumerate(matrix[iter]):
b = (float(z)-my_min)/(my_max-my_min)
g = 0
r = 1-b
rect = plt.Rectangle([y, x], 0.9, 0.9, facecolor=(r, g, b), edgecolor="black")
item.add_patch(rect)
item.autoscale_view()
plt.show()
如果我没有犯任何愚蠢的错误,你会证实这是一个错误,我会在github上打开一个问题。
答案 0 :(得分:1)
问题似乎是对plt.contourf
的调用(我并不严格理解为什么会这样)。但是,它是通过状态机接口调用的,因此两次都通过循环图到axe_2
(因为那是plt.gca()
返回的)。您正在绘制2x2全0阵列的轮廓,它(正确地)绘制为[0,0,1,1]处的蓝色框,这是您看到的蓝色边缘。
在3轴的情况下“正确”工作,因为pyplot
认为最后的轴是当前轴。