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