Python imshow с цветовой картой, зависящей от значения

У меня есть двумерный массив размером 2000x200, который может иметь N разных уникальных значений (около 20-30). Я хочу иметь возможность imshow использовать этот массив, используя colormap (нелинейный), который имеет случайные цвета (например, Set3), который присваивает каждому уникальному значению случайный цвет. Проблема использования Set3 для этой цели заключается в том, что он назначает случайный цвет для диапазона значений, но не уникальное значение. Пример проблемы показан ниже:

введите здесь описание изображения


person Mc Missile    schedule 08.08.2019    source источник
comment
Возможно, стоит собрать ваши данные во фрейм pandas, к которому затем можно применить столбец меток. После этого попробуйте выполнить такое решение, как: stackoverflow.com/questions/21654635/   -  person PeptideWitch    schedule 08.08.2019
comment
Ознакомьтесь с этим вопросом; по двум причинам: (1) это довольно близко к тому, что вы хотите сделать, поэтому ответ может уже помочь, и (2) он показывает вам, какую информацию вам нужно предоставить, чтобы получить здесь высококачественный ответ.   -  person ImportanceOfBeingErnest    schedule 08.08.2019


Ответы (1)


Вы можете создать n цветов (в вашем случае 20-30), а затем присвоить каждому значению случайный цвет. См. следующий код о том, как создать n цветов, а затем о том, как назначить каждому прямоугольнику уникальный цвет.

import matplotlib.pyplot as plt

def get_cmap(n, name='hsv'):
    '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
    RGB color; the keyword argument name must be a standard mpl colormap name.'''
    return plt.cm.get_cmap(name, n)
def main():
    N = 30
    fig=plt.figure()
    ax=fig.add_subplot(111)   
    plt.axis('scaled')
    ax.set_xlim([ 0, N])
    ax.set_ylim([-0.5, 0.5])
    cmap = get_cmap(N)
    for i in range(N):
        rect = plt.Rectangle((i, -0.5), 1, 1, facecolor=cmap(i))
        ax.add_artist(rect)
    ax.set_yticks([])
    plt.show()

if __name__=='__main__':
    main()

Вместо использования for i в диапазоне (N) вы можете использовать какую-то хеш-функцию для каждого значения. Надеюсь, это поможет вам.

person mashtock    schedule 08.08.2019