首页 > 解决方案 > 如何在不使用“set_bad”的情况下在 matplotlib.pyplot 中显示具有特定颜色的矩阵

问题描述

我想创建一个矩阵的多个图像。我已经修改了matplotlib 中绘制网格模式的代码,它使用 cmap 属性“set_bad”将 Nan 值设置为透明白色。

有没有办法避免设置“set_bad”、“set_upper”和“set_lower”,以及准确地告诉颜色图要为矩阵值显示什么颜色?

如果我的矩阵是用零填充的 2x2,我想要一个全黑图像: 在此处输入图像描述.

如果我的矩阵是 2x2 填充的,我想要一个像这样的全白图像: 在此处输入图像描述 这就是问题所在。当矩阵值都为 1.0 时,图像是完全黑色的。(我猜是因为所有值都与 cmap 使用第一个值(黑色)呈现的值相同?)。

如果我的矩阵是 2x2,对角线上的矩阵我想要这个图像:在此处输入图像描述

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


N = 2

# make an empty data set
data = np.zeros((N, N))


for i in range(N):
    for j in range(N):
        # when all elements are 0 I want it to be black. 
        # Currently works how I want it to
        #data[i,j] = 0

        # When all elements are 1 I want it to be white but it is all black.
        # This isn't working like I want it to.
        data[i,j] = 1

        # here I want to have white squares in the top left and bottom right. 
        # Currently works how I want it to
        #data[0,0] = 1
        #data[1,1] = 1

print(data)
# make a figure + axes
fig, ax = plt.subplots(1, 1, tight_layout=True)
# make color map
my_cmap = matplotlib.colors.ListedColormap(['black', 'white'])

# draw the grid
for x in range(N + 1):
    ax.axhline(x, lw=2, color='k', zorder=5)
    ax.axvline(x, lw=2, color='k', zorder=5)
# draw the boxes
ax.imshow(data, interpolation='none', cmap=my_cmap, extent=[0, N, 0, N], zorder=0)
# turn off the axis labels
ax.axis('off')
plt.show()

标签: pythonmatplotlibcolors

解决方案


imshow在映射到颜色之前缩放数据。标准化可以通过norm参数来控制。从文档中:

默认情况下,使用将最小值映射到 0 并将最大值映射到 1 的线性缩放。

因此,您必须传递一个自定义Normalize实例。

在您的代码中,您必须执行以下操作:

ax.imshow(data, interpolation='none', cmap=my_cmap, extent=[0, N, 0, N], zorder=0, norm=Normalize(0,1))

显式映射到 [0,1] 区间。

结果与Normalize(0,1)


推荐阅读