matplotlib Python -基于值绘制彩色格网

qlfbtfca  于 2023-01-31  发布在  Python
关注(0)|答案(3)|浏览(189)

我一直在这里和网上搜索。我发现了一些接近我想要的问题/答案,但仍然无法达到我正在寻找的。
例如,我有一个包含100个值的数组。这些值的范围从0到100。我想将这个数组绘制为网格,根据数组中的值填充正方形。
到目前为止,我找到的解决方案如下:
Drawing grid pattern in matplotlib
以及
custom matplotlib plot : chess board like table with colored cells
在我提到的例子中,颜色的范围是变化的,不是固定的。
然而,我想知道的是,我是否可以设置特定值和颜色的范围。例如,如果值在10和20之间,让网格的颜色是红色。否则,如果值在20和30之间,让颜色是蓝色。等等。
这在python中是如何实现的呢?

yqhsw0fo

yqhsw0fo1#

您可以为自定义颜色创建ListedColormap,并使用颜色BoundaryNorms设置阈值。

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

data = np.random.rand(10, 10) * 20

# create discrete colormap
cmap = colors.ListedColormap(['red', 'blue'])
bounds = [0,10,20]
norm = colors.BoundaryNorm(bounds, cmap.N)

fig, ax = plt.subplots()
ax.imshow(data, cmap=cmap, norm=norm)

# draw gridlines
ax.grid(which='major', axis='both', linestyle='-', color='k', linewidth=2)
ax.set_xticks(np.arange(-.5, 10, 1));
ax.set_yticks(np.arange(-.5, 10, 1));

plt.show()

导致;

要了解更多信息,您可以查看此matplotlib example

wbgh16ku

wbgh16ku2#

这取决于你需要你的颜色使用什么单位,但是只要一个简单的if语句就可以了。

def find_colour(_val):
    # Colour value constants
    _colours = {"blue": [0.0, 0.0, 1.0],
                "green": [0.0, 1.0, 0.00],
                "yellow": [1.0, 1.0, 0.0],
                "red": [1.0, 0.0, 0.0]}

    # Map the value to a colour
    _colour = [0, 0, 0]
    if _val > 30:
        _colour = _colours["red"]
    elif _val > 20:
        _colour = _colours["blue"]
    elif _val > 10:
        _colour = _colours["green"]
    elif _val > 0:
        _colour = _colours["yellow"]

    return tuple(_colour)

只需将元组转换为您需要的任何单位,例如RGBA(..),然后您就可以实现您已经找到的方法来实现网格。

bvpmtnay

bvpmtnay3#

根据@ umotomo的回答,还有一个更复杂的版本:

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

def plot_colored_grid(data, colors=['white', 'green'], bounds=[0, 0.5, 1], grid=True, labels=False, frame=True):
"""Plot 2d matrix with grid with well-defined colors for specific boundary values.

:param data: 2d matrix
:param colors: colors
:param bounds: bounds between which the respective color will be plotted
:param grid: whether grid should be plotted
:param labels: whether labels should be plotted
:param frame: whether frame should be plotted
"""

# create discrete colormap
cmap = mplt.colors.ListedColormap(colors)
norm = mplt.colors.BoundaryNorm(bounds, cmap.N)

# enable or disable frame
plt.figure(frameon=frame)

# show grid
if grid:
    plt.grid(axis='both', color='k', linewidth=2) 
    plt.xticks(np.arange(0.5, data.shape[1], 1))  # correct grid sizes
    plt.yticks(np.arange(0.5, data.shape[0], 1))

# disable labels
if not labels:
    plt.tick_params(bottom=False, top=False, left=False, right=False, labelbottom=False, labelleft=False) 
# plot data matrix
plt.imshow(data, cmap=cmap, norm=norm)

# display main axis 
plt.show()

例如,如果您要绘制二进制矩阵plot_colored_grid(np.array([[True, False], [False, True]])),则将得出:

另一个例子:

data = np.array([
    [9, 12, 24],
    [5, 2, 33],
    [27, 36, 15]
])

plot_colored_grid(data, colors=['white', 'green', 'purple', 'red'], bounds=[0, 10, 20, 30, 40])

这将导致:

相关问题