Как получить разноцветные линии для разных сюжетов на одной фигуре? - PullRequest
167 голосов
/ 26 января 2011

Я использую matplotlib для создания графиков.Я должен идентифицировать каждый график разным цветом, который должен автоматически генерироваться Python.

Не могли бы вы дать мне способ разместить разные цвета для разных графиков на одном рисунке?

Ответы [ 4 ]

352 голосов
/ 26 января 2011

Matplotlib делает это по умолчанию.

например:.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

Basic plot demonstrating color cycling

И, как вы уже знаете, вы можете легко добавить легенду:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Basic plot with legend

Если вы хотите контролировать цвета, которые будут циклически изменяться:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Plot showing control over default color cycling

Надеюсь, это немного поможет! Если вы не знакомы с matplotlib, этот учебник - хорошее место для начала .

Edit:

Прежде всего, если у вас есть много (> 5) вещей, которые вы хотите нанести на одну фигуру, либо:

  1. Разместите их на разных участках (рассмотрите возможность использования нескольких участков на одной фигуре) или
  2. Используйте что-то кроме цвета (то есть стили маркера или толщину линий), чтобы различать их.

В противном случае вы получите очень грязный заговор! Будьте добры к тому, кто когда-либо прочитает все, что вы делаете, и не пытайтесь втиснуть 15 разных вещей в одну фигуру !!

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

Как уже говорилось, если вы действительно хотите поместить 20 линий на одну ось с 20 относительно разными цветами, вот один из способов сделать это:

import matplotlib.pyplot as plt
import numpy as np

num_plots = 20

# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)])

# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
    plt.plot(x, i * x + 5 * i)
    labels.append(r'$y = %ix + %i$' % (i, 5*i))

# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center', 
           bbox_to_anchor=[0.5, 1.1], 
           columnspacing=1.0, labelspacing=0.0,
           handletextpad=0.0, handlelength=1.5,
           fancybox=True, shadow=True)

plt.show()

Unique colors for 20 lines based on a given colormap

33 голосов
/ 13 марта 2016

Установка их позже

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

Некоторые случайные данные

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)


for i in range(1,15):
    ax1.plot(np.array([1,5])*i,label=i)

Кусок кода, который вам нужен:

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired   
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
    j.set_color(colors[i])


ax1.legend(loc=2)

Результат следующий: enter image description here

2 голосов
/ 18 октября 2013

Я хотел бы предложить небольшое улучшение в последнем ответе из цикла, приведенном в предыдущем посте (этот пост правильный и все еще должен быть принят).Неявное предположение, сделанное при маркировке последнего примера, состоит в том, что plt.label(LIST) помещает номер метки X в LIST с линией, соответствующей X-му вызову plot.Я столкнулся с проблемами с этим подходом раньше.Рекомендуемый способ создавать легенды и настраивать их метки в соответствии с документацией на matplotlibs (http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item) - это иметь теплое ощущение, что метки соответствуют точным графикам, которые, как вы думаете, они делают:

...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
    plotHandles.append(x)
    labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)

**: Matplotlib Legends не работает

1 голос
/ 08 декабря 2018

TL; DR Нет, это невозможно сделать автоматически .Да, это возможно.

Каждый график (axes) на рисунке (figure) имеет свой собственный цикл цветов - если вы не назначаете разный цвет для каждого графика, все графикиразделить тот же порядок цветов.

Достижение разного цвета на каждом графике может быть достигнуто автоматически только в том случае, если мы растягиваем немного, что означает «автоматически».ОП написал

[...] Я должен идентифицировать каждый сюжет с различным цветом, который должен автоматически генерироваться [Matplotlib].

Но ...Matplotlib автоматически генерирует разные цвета для каждой отдельной кривой

In [10]: import numpy as np 
    ...: import matplotlib.pyplot as plt                                                  

In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));                                             
Out[11]: 

enter image description here

Так почему запрос OP?Если мы продолжим читать, у нас будет

Не могли бы вы дать мне способ разместить разные цвета для разных графиков на одной фигуре?

и это имеет смысл,потому что каждый сюжет (каждый axes на языке Matplotlib) имеет свой собственный color_cycle (точнее, в 2018 году, его prop_cycle), и каждый сюжет (axes) использует одни и те же цвета в том же порядке.

In [12]: fig, axes = plt.subplots(2,3)                                                    

In [13]: for ax in axes.flatten(): 
    ...:     ax.plot((0,1), (0,1)) 

enter image description here

Если в этом смысл первоначального вопроса, можно явно указать разные цвета для каждого сюжета.

Если графики (как это часто бывает) генерируются в цикле, у нас должна быть дополнительная переменная цикла, чтобы переопределить цвет автоматически , выбранный Matplotlib.

In [14]: fig, axes = plt.subplots(2,3)                                                    

In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'): 
    ...:     ax.plot((0,1), (0,1), short_color_name)

enter image description here

Другой возможностью является создание объекта-циклиста

from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()

fig, axes = plt.subplots(2,3)
for ax in axes.flat:
    ax.plot((0,1), (0,1), **next(actual_cycler))

enter image description here

Обратите внимание, что type(my_cycler) равно cycler.Cycler но type(actual_cycler) - это itertools.cycle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...