Ошибка цветовой схемы Matplotlib с длиной-4 массива

У меня есть несколько массивов, которые мне нужно построить в цикле с определенной цветовой схемой. Однако один из моих массивов – длина 4, и я сталкиваюсь с этой проблемой:

import numpy as np import matplotlib as plt ns = range(2,8) cm = plt.cm.get_cmap('spectral') cmap = [cm(1.*i/len(ns)) for i in range(len(ns))] for i,n in enumerate(ns): x = np.linspace(0, 10, num=n) y = np.zeros(n) + i plt.scatter(x, y, c=cmap[i], edgecolor='none', s=50, label=n) plt.legend(loc='lower left') plt.show() 

Imgur

  • Как декодировать цветовое сопоставление в Colormap Matplotlib?
  • Эквивалент Python для Demcmap Matlab (высота +/- соответствующая цветовая палитра)
  • Как использовать viridis в matplotlib 1.4
  • Для n=4 , похоже, Matplotlib применяет каждый элемент cmap RGBA cmap к каждому значению массива. Для других массивов длины ожидается поведение.

    Теперь у меня есть гораздо более сложный код и я не хочу тратить время на переписывание цикла. Есть ли обходной путь для этого?

  • Numpy.Array в списке Python?
  • Невозможно получить незначительные линии сетки в фигуре matplotlib
  • Scipy интерполяция, как изменить размер / перемасштабировать матрицу 3x3 до 5x5?
  • Как нормализовать массив NumPy в пределах определенного диапазона?
  • Установка 2D-гауссовой функции с помощью scipy.optimize.curve_fit - ValueError и minpack.error
  • Как вычислить ближайшую положительную полуопределенную матрицу?
  • One Solution collect form web for “Ошибка цветовой схемы Matplotlib с длиной-4 массива”

    Похоже, вы столкнулись с неудачным дизайном API при обработке аргумента c . Один из способов решения проблемы состоит в том, чтобы создать массив с формой (len(x), 4) содержащий len(x) копии желаемого цвета. Например

     ns = range(2,8) cm = plt.cm.get_cmap('spectral') cmap = [cm(1.*i/len(ns)) for i in range(len(ns))] for i,n in enumerate(ns): x = np.linspace(0, 10, num=n) y = np.zeros(n) + i c = np.tile(cmap[i], (len(x), 1)) plt.scatter(x, y, c=c, edgecolor='none', s=50, label=n) plt.legend(loc='lower left') plt.show() 

    Другой альтернативой является преобразование значений RBG в шестнадцатеричную строку и передачу альфа-канала цвета с использованием alpha аргумента. Как отметил @ali_m в комментарии, функция matplotlib.colors.rgb2hex делает это легко. Если вы знаете, что альфа-канал цвета всегда равен 1.0, вы можете удалить код, создающий alpha аргумент.

     import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt ns = range(2,8) cm = plt.cm.get_cmap('spectral') cmap = [cm(1.*i/len(ns)) for i in range(len(ns))] for i,n in enumerate(ns): x = np.linspace(0, 10, num=n) y = np.zeros(n) + i c = mpl.colors.rgb2hex(cmap[i]) alpha = cmap[i][3] plt.scatter(x, y, c=c, edgecolor='none', s=50, label=n, alpha=alpha) plt.legend(loc='lower left') plt.show() 
    Python - лучший язык программирования в мире.