python / matplotlib – многоцветная линия

Я пытаюсь создать цветную линию с определенными условиями. В принципе, я хотел бы, чтобы линия окрашивалась в красный цвет, когда указывала вниз на ось y, зеленая при наведении вверх и синяя, когда ни одна.

Я играл с некоторыми подобными примерами, которые я нашел, но я никогда не мог их преобразовать для работы с plot () на оси. Просто интересно, как это можно сделать.

Вот какой код, который я привел до сих пор:

#create x,y coordinates x = numpy.random.choice(10,10) y = numpy.random.choice(10,10) #create an array of colors based on direction of line (0=r, 1=g, 2=b) colors = [] #create an array that is one position away from original #to determine direction of line yCopy = list(y[1:]) for y1,y2 in zip(y,yCopy): if y1 > y2: colors.append(0) elif y1 < y2: colors.append(1) else: colors.append(2) #add tenth spot to array as loop only does nine colors.append(2) #create a numpy array of colors categories = numpy.array(colors) #create a color map with the three colors colormap = numpy.array([matplotlib.colors.colorConverter.to_rgb('r'),matplotlib.colors.colorConverter.to_rgb('g'),matplotlib.colors.colorConverter.to_rgb('b')]) #plot line matplotlib.axes.plot(x,y,color=colormap[categories]) 

Не уверен, как получить plot (), чтобы принять массив цветов. Я всегда получаю ошибку о типе формата, используемом в качестве цвета. Пробовал шестнадцатеричный, десятичный, строковый и плавающий. Работает отлично с разбросом ().

благодаря

3 Solutions collect form web for “python / matplotlib – многоцветная линия”

Я не думаю, что вы можете использовать массив цветов в plot (в документации говорится, что цвет может быть любым цветом в матрице, в то время как в документах scatter можно использовать массив).

Однако вы можете подделать его, построив каждую строку отдельно:

 import numpy from matplotlib import pyplot as plt x = range(10) y = numpy.random.choice(10,10) for x1, x2, y1,y2 in zip(x, x[1:], y, y[1:]): if y1 > y2: plt.plot([x1, x2], [y1, y2], 'r') elif y1 < y2: plt.plot([x1, x2], [y1, y2], 'g') else: plt.plot([x1, x2], [y1, y2], 'b') plt.show() 

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

ОК. Поэтому я понял, как это сделать, используя LineCollecion, чтобы нарисовать линию на оси.

 import numpy as np import pylab as pl from matplotlib import collections as mc segments = [] colors = np.zeros(shape=(10,4)) x = range(10) y = np.random.choice(10,10) i = 0 for x1, x2, y1,y2 in zip(x, x[1:], y, y[1:]): if y1 > y2: colors[i] = tuple([1,0,0,1]) elif y1 < y2: colors[i] = tuple([0,1,0,1]) else: colors[i] = tuple([0,0,1,1]) segments.append([(x1, y1), (x2, y2)]) i += 1 lc = mc.LineCollection(segments, colors=colors, linewidths=2) fig, ax = pl.subplots() ax.add_collection(lc) ax.autoscale() ax.margins(0.1) pl.show() 

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

На странице matplotlib есть пример, показывающий, как использовать LineCollection для построения многоцветной линии.

Остальная проблема – получить цвета для коллекции строк. Поэтому, если y – значения для сравнения,

 cm = dict(zip(range(-1,2,1),list("gbr"))) colors = list( map( cm.get , np.sign(np.diff(y)) )) 

Полный код:

 import numpy as np; np.random.seed(5) import matplotlib.pyplot as plt from matplotlib.collections import LineCollection x = np.arange(10) y = np.random.choice(10,10) points = np.array([x, y]).T.reshape(-1, 1, 2) segments = np.concatenate([points[:-1], points[1:]], axis=1) cm = dict(zip(range(-1,2,1),list("rbg"))) colors = list( map( cm.get , np.sign(np.diff(y)) )) lc = LineCollection(segments, colors=colors, linewidths=2) fig, ax = plt.subplots() ax.add_collection(lc) ax.autoscale() ax.margins(0.1) plt.show() 

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

  • Автоматическое размещение аннотации (matploylib.pyplot) или аннотации списков
  • Простая сальто-хвостовая сварка
  • Горизонтальная гистограмма в Matplotlib
  • Python, Matplotlib, subplot: Как установить диапазон осей?
  • оболочка python в emacs зависает при использовании matplotlib
  • Ошибка opencv: размеры входных аргументов не совпадают
  • Настройка точек без данных на белый с помощью Matplotlib imshow
  • Matplotlib Вторая ось x с преобразованными значениями
  • Гистограмма со сложными компонентами
  • matplotlib.pyplot Как назвать разные строки в одном и том же сюжете?
  • Кривая Matplotlib со стрелками
  • Python - лучший язык программирования в мире.