Як вибрати новий колір для кожної наміченої лінії в межах фігури в matplotlib?


109

Я хотів би НЕ вказувати колір для кожної накресленої лінії, а кожен рядок повинен мати виразний колір. Але якщо я біжу:

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

plt.show()

то я отримую цей вихід:

Зображення графіка виводиться кодом вище

Якщо ви подивитесь на зображення вище, ви побачите, що matplotlib намагається підібрати кольори для кожної лінії, які є різними, але зрештою він повторно використовує кольори - у перших десяти лінійках використовуються ті ж кольори, що і в нижній. Я просто хочу не допустити повторення вже використаних кольорів І / АБО подати йому список кольорів.

Відповіді:


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.


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
Хороша відповідь Джо, і, здається, відповідає на питання Ксильда, тому я просто залишу це на цьому. Крім того, варто відзначити, що є кілька хороших відповідей на питання про створення різних кольорів, наприклад stackoverflow.com/questions/470690/…
tom10

Це працює для будь-якого сюжету? Я спробував set_prop_cycle на Axes3D, тоді я використовував цикл для декількох ділянок з ax.plot_wireframe (), але 2 ділянки забарвлені тим самим кольором.
Парк Joonho

112

Зазвичай я використовую другий із них:

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: Приклад сюжету з ітерами, наступний колір


Я використовував №2. У мене є список каналів, які мені потрібно побудувати, але вони можуть бути різної довжини. Я виявив, що встановлення n = len у цьому списку було дуже корисним для переконання, що вибрані кольори охоплюють діапазон, і ви можете визначити різницю. Якщо ця кількість занадто висока, важко помітити різницю в кольорах.
серпня

Я використовував №1, це було корисно використовувати з перерахуванням (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

Випробуваний у матплотлібі 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
Так, я якось хотів уникнути подібного. Я заглянув у кольорові карти, але я дуже розгублений, як ними користуватися.
dlamotte

Це рішення не дає легкого способу управління кольоровою
картою

Це дуже добре, особливо, коли set_prop_cycle виходить з ладу. Я не знаю, чому set_prop_cycle або автоматичне фарбування не вдається в plot_wireframe () в Axes3D. Але це своєрідне базове / ручне рішення для фарбування.
Парк Joonho

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/isissue/10840 для обговорення того, чому ви не можете телефонуватиaxes.set_prop_cycle(color=cmap) .

Список попередньо визначених якісних кольорових карт доступний на веб-сторінці https://matplotlib.org/gallery/color/colormap_reference.html :

Список якісних кольорових карт


Зауважте, що для цього потрібні перші 3 кольори
Бен Джонс,

2

Ви також можете змінити цикл кольорів за замовчуванням у вашому matplotlibrcфайлі. Якщо ви не знаєте, де цей файл, зробіть наступне в python:

import matplotlib
matplotlib.matplotlib_fname()

Це покаже вам шлях до поточно використовуваного файлу matplotlibrc. У цьому файлі ви знайдете серед багатьох інших налаштувань, також і для axes.color.cycle. Просто введіть бажану послідовність кольорів, і ви знайдете її у кожному створеному сюжеті. Зауважте, що ви також можете використовувати всі дійсні імена кольорів html у matplotlib.


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()

Вихід:

Виведення графіку за кодом вище

Зараз усі кольори різні - хоча я визнаю, що я намагаюся виділити декілька з них!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.