Как выбрать новый цвет для каждой построенной линии внутри фигуры в matplotlib?

109

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

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

тогда я получаю такой результат:

Изображение графика, выводимого приведенным выше кодом

Если вы посмотрите на изображение выше, вы увидите, что matplotlib пытается выбрать цвета для каждой строки, которые отличаются, но в конечном итоге он повторно использует цвета - верхние десять строк используют те же цвета, что и нижние десять. Я просто хочу, чтобы он не повторял уже использованные цвета И / ИЛИ подавал ему список используемых цветов.

Dlamotte
источник

Ответы:

59

matplotlib 1.5+

Вы можете использовать axes.set_prop_cycle( пример ).

matplotlib 1.0-1.4

Вы можете использовать axes.set_color_cycle( пример ).

matplotlib 0.x

Вы можете использовать Axes.set_default_color_cycle.

tom10
источник
1
Подробнее о том, что я искал ... Есть ли шанс, что вы можете добавить информацию о том, как использовать цветовую карту для создания списка из N цветов?
dlamotte
19
@xyld - Не слишком много вставлять в свой ответ, но в конце этого ответа есть пример: stackoverflow.com/questions/4805048/… В основном вы просто делаете это:, [colormap(i) for i in np.linspace(0, 0.9, num_plots)]где colormapодна из цветовых карт, matplotlib.pyplot.cmа numplotsэто число уникальных цветов, которые вы хотите. Однако помните, что это может привести к тому, что цвета будут трудно отличить друг от друга !!
Джо Кингтон
4
Хороший ответ, Джо, и, кажется, он отвечает на вопрос xyld, так что я просто оставлю это как есть. Кроме того, стоит отметить, что есть несколько хороших ответов на вопрос о генерации различных цветов, например stackoverflow.com/questions/470690/…
tom10
Подходит для любого сюжета? Я пробовал set_prop_cycle на Axes3D, затем использовал цикл for для нескольких графиков с помощью ax.plot_wireframe (), но 2 графика окрашены в один цвет.
Пак Джунхо,
114

Обычно я использую второй из них:

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
   plt.plot(x, y,c=c)

#or version 2:

color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
   c=next(color)
   plt.plot(x, y,c=c)

Пример 2: пример сюжета с iter, следующий цвет

Марк Эмери
источник
Я использовал №2. У меня есть список каналов, которые мне нужно построить, но они могут быть разной длины. Я обнаружил, что установка n = len в этом списке очень полезна для того, чтобы убедиться, что выбранные цвета охватывают весь диапазон, и вы можете заметить разницу. Если это число слишком велико, трудно заметить разницу в цветах.
сиреневый
Я использовал # 1, было полезно использовать с enumerate (list_name)
DevX
11

prop_cycle

color_cycleустарел в версии 1.5 в пользу этого обобщения: http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

Также показано в примере (теперь плохо названном): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html, упомянутом по адресу: https://stackoverflow.com/a/4971431/895245

Проверено в matplotlib 1.5.1.

Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
9

Я не знаю, можете ли вы автоматически изменять цвет, но вы можете использовать свой цикл для генерации разных цветов:

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

В этом случае цвета будут варьироваться от черного до 100% зеленого, но вы можете настроить его, если хотите.

См. Документацию по matplotlib plot () и найдите colorаргумент ключевого слова.

Если вы хотите передать список цветов, просто убедитесь, что у вас есть достаточно большой список, а затем используйте индекс цикла, чтобы выбрать цвет.

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])
Андреа Спадаччини
источник
1
Да, я вроде как хотел избежать этого. Я заглянул в Color Maps, но не понимаю, как их использовать.
dlamotte
Это решение не обеспечивает простого способа управления
цветовой картой
Это очень хорошо, особенно когда set_prop_cycle не работает. Я не знаю, почему set_prop_cycle или автоматическая раскраска не работают в plot_wireframe () в Axes3D. Но это своего рода базовое / ручное решение для раскрашивания.
Пак Джунхо,
6

Вы можете использовать предопределенную «качественную цветовую карту» следующим образом:

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

Проверено на matplotlib 3.0.3. См. Https://github.com/matplotlib/matplotlib/issues/10840 для обсуждения того, почему вы не можете позвонить axes.set_prop_cycle(color=cmap).

Список предопределенных качественных цветовых карт доступен по адресу https://matplotlib.org/gallery/color/colormap_reference.html :

Список качественных цветовых карт

ньянпасу64
источник
Обратите внимание, что на них последовательно используются первые 3 цвета
Бен Джонс
2

Вы также можете изменить цветовой цикл по умолчанию в вашем matplotlibrcфайле. Если вы не знаете, где находится этот файл, сделайте в python следующее:

import matplotlib
matplotlib.matplotlib_fname()

Это покажет вам путь к вашему текущему файлу matplotlibrc. В этом файле вы найдете среди множества других настроек и настройки axes.color.cycle. Просто введите желаемую последовательность цветов, и вы найдете ее на каждом создаваемом вами графике. Обратите внимание, что вы также можете использовать все допустимые имена цветов html в matplotlib.

Thomasillo
источник
0

Как отмечает Ciro , вы можете использовать prop_cycleдля установки списка цветов для цикла matplotlib. Но сколько цветов? Что, если вы хотите использовать один и тот же цветовой цикл для множества графиков с разным количеством линий?

Одна из тактик - использовать формулу, подобную той, что приведена на https://gamedev.stackexchange.com/a/46469/22397 , для создания бесконечной последовательности цветов, в которой каждый цвет пытается значительно отличаться от всех предшествующих.

К сожалению, prop_cycleне принимает бесконечные последовательности - он будет зависать навсегда, если вы передадите ему одну. Но мы можем взять, скажем, первые 1000 цветов, сгенерированных из такой последовательности, и установить их как цветовой цикл. Таким образом, для графиков с любым нормальным количеством линий вы должны получить различимые цвета.

Пример:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

Вывод:

Вывод графика по приведенному выше коду

Теперь все цвета разные - хотя я признаю, что мне трудно различить некоторые из них!

Марк Эмери
источник