Использование Colormaps для установки цвета линии в matplotlib

Как установить цвет линии в matplotlib со скалярными значениями, указанными во время выполнения, с использованием цветовой карты (например, jet )? Я попробовал здесь несколько разных подходов, и я думаю, что я в тупике. values[] – это строгий массив скаляров. кривые представляют собой набор 1-мерных массивов, а метки – это массив текстовых строк. Каждый из массивов имеет одинаковую длину.

 fig = plt.figure() ax = fig.add_subplot(111) jet = colors.Colormap('jet') cNorm = colors.Normalize(vmin=0, vmax=values[-1]) scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) lines = [] for idx in range(len(curves)): line = curves[idx] colorVal = scalarMap.to_rgba(values[idx]) retLine, = ax.plot(line, color=colorVal) #retLine.set_color() lines.append(retLine) ax.legend(lines, labels, loc='upper right') ax.grid() plt.show() 

3 Solutions collect form web for “Использование Colormaps для установки цвета линии в matplotlib”

Ошибка, которую вы получаете, объясняется тем, как вы определяете jet . Вы создаете базовый класс Colormap с именем «jet», но это сильно отличается от определения по умолчанию Colormap карты «jet». Этот базовый класс никогда не должен создаваться напрямую, и должны быть созданы только подклассы.

То, что вы нашли с вашим примером, – это плохое поведение в Matplotlib. Должно быть четкое сообщение об ошибке, сгенерированное при запуске этого кода.

Это обновленная версия вашего примера:

 import matplotlib.pyplot as plt import matplotlib.colors as colors import matplotlib.cm as cmx import numpy as np # define some random data that emulates your indeded code: NCURVES = 10 np.random.seed(101) curves = [np.random.random(20) for i in range(NCURVES)] values = range(NCURVES) fig = plt.figure() ax = fig.add_subplot(111) # replace the next line #jet = colors.Colormap('jet') # with jet = cm = plt.get_cmap('jet') cNorm = colors.Normalize(vmin=0, vmax=values[-1]) scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) print scalarMap.get_clim() lines = [] for idx in range(len(curves)): line = curves[idx] colorVal = scalarMap.to_rgba(values[idx]) colorText = ( 'color: (%4.2f,%4.2f,%4.2f)'%(colorVal[0],colorVal[1],colorVal[2]) ) retLine, = ax.plot(line, color=colorVal, label=colorText) lines.append(retLine) #added this to get the legend to work handles,labels = ax.get_legend_handles_labels() ax.legend(handles, labels, loc='upper right') ax.grid() plt.show() 

В результате чего:

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

Использование ScalarMappable – это улучшение по сравнению с подходом, представленным в моем ответном ответе: создание более 20 уникальных цветов легенды с использованием matplotlib

Я подумал, что было бы полезно включить то, что я считаю более простым методом, используя linspace numpy в сочетании с объектом cm-type matplotlib. Возможно, что вышеупомянутое решение предназначено для более старой версии. Я использую python 3.4.3, matplotlib 1.4.3 и numpy 1.9.3., И мое решение выглядит следующим образом.

 import matplotlib.pyplot as plt from matplotlib import cm from numpy import linspace start = 0.0 stop = 1.0 number_of_lines= 1000 cm_subsection = linspace(start, stop, number_of_lines) colors = [ cm.jet(x) for x in cm_subsection ] for i, color in enumerate(colors): plt.axhline(i, color=color) plt.ylabel('Line Number') plt.show() 

Это приводит к 1000 уникальным линиям, которые охватывают весь цветной cm.jet, как показано на рисунке ниже. Если вы запустите этот скрипт, вы увидите, что вы можете увеличивать масштаб на отдельных строках.

cm.jet между 0.0 и 1.0 с 1000 градусами

Теперь скажите, что я хочу, чтобы мои 1000 строк цвета просто охватывали зеленоватую часть между строками 400-600. Я просто меняю значения начала и остановки на 0,4 и 0,6, и это приводит к использованию только 20% цветной карты cm.jet между 0,4 и 0.6.

cm.jet от 0,4 до 0,6 с 1000 градусами

Поэтому в сводке одной строки вы можете создать список цветов rgba из цветовой карты matplotlib.cm соответственно:

 colors = [ cm.jet(x) for x in linspace(start, stop, number_of_lines) ] 

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

 >>> from matplotlib import cm >>> dir(cm) 

Сочетание стилей линий, маркеров и качественных цветов от matplotlib :

 import itertools import matplotlib as mpl import matplotlib.pyplot as plt N = 8*4+10 l_styles = ['-','--','-.',':'] m_styles = ['','.','o','^','*'] colormap = mpl.cm.Dark2.colors # Qualitative colormap for i,(marker,linestyle,color) in zip(range(N),itertools.product(m_styles,l_styles, colormap)): plt.plot([0,1,2],[0,2*i,2*i], color=color, linestyle=linestyle,marker=marker,label=i) plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=4); 

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

  • Matplotlib axvspan - сплошная заливка?
  • Горизонтальная гистограмма в Matplotlib
  • Скрытие текста оси в графиках matplotlib
  • Сортировка данных для отображения максимального значения barchart на python
  • Графическая точка на прямой (номер строки) в Python
  • Преобразование текста в Matplotlib при экспорте файлов .eps
  • Возможно ли наложение 3-х гистограмм в matplotlib?
  • Проблемы с Matplotlib - imshow twiny ()
  • Python - лучший язык программирования в мире.