Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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) вещей, которые вы хотите построить на одной фигуре, либо:

  • Поместите их на разные сюжеты (подумайте об использовании нескольких подзаголовков на одной фигуре) или
  • Чтобы отличить их, используйте что-то другое, кроме цвета (например, стили маркера или толщину линии).

В противном случае вы соберетесь с очень грязным сюжетом! Будьте любезны, кто когда-либо будет читать все, что вы делаете, и не пытайтесь втиснуть 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

Ответ 2

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

Если вы не знаете количество графиков, которые вы собираетесь строить, вы можете изменить цвета, как только вы построили их, чтобы получить номер непосредственно из графика с использованием .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

Ответ 3

Я хотел бы предложить небольшое улучшение в последнем ответе цикла, приведенном в предыдущем сообщении (это сообщение правильное и должно быть принято). Неявное предположение, сделанное при маркировке последнего примера, заключается в том, что 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 не работают

Ответ 4

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

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

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

и это имеет смысл, потому что каждый участок (каждую 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