Python-построение цветной сетки на основе значений

Я искал здесь и в сети. Я нашел как-то близкие вопросы/ответы на то, что я хочу, но все еще не мог добраться до того, что я ищу.

У меня есть массив, например, 100 значений. Значения находятся в диапазоне от 0 до 100. Я хочу построить этот массив как сетку, заполняя квадраты в соответствии со значениями в массиве.

решения, которые я нашел до сих пор, похожи на следующие:

рисунок сетки в библиотек matplotlib

и

пользовательский сюжет matplotlib: шахматная доска, как таблица с цветными ячейками

в примерах, которые я упомянул, диапазоны цветов различаются и не фиксируются.

однако мне интересно, могу ли я установить диапазоны для определенных значений и цветов. Например, если значения находятся между 10 и 20, пусть цвет квадрата сетки будет красным. еще если значения между 20 и 30, пусть цвет синий. так далее.

Как это может быть достигнуто в python?

2 ответов


вы можете создать 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()

в результате; Plot with BoundaryNorms

для больше, вы можете проверить это примере библиотек matplotlib.


Это зависит от того, в каких единицах вам нужны ваши цвета, но просто простой оператор 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(..). Затем вы можете реализовать методы, которые, похоже, вы уже нашли для достижения сетки.