Ответы:
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()
И, как вы уже знаете, вы можете легко добавить легенду:
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()
Если вы хотите контролировать цвета, которые будут циклически проходить:
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()
Если вы не знакомы с matplotlib, учебник - хорошее место для начала .
Редактировать:
Прежде всего, если у вас есть много (> 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_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, 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()
axes
) и спрашивал об изменении цвета одной линии на разных графиках (разных axes
) ... Тем не менее, отличный ответ на важный вопрос (возможно, отличается от того, что задавал ОП, но никто не может сказать, потому что они задали этот единственный вопрос и исчезли!) - +1
Если вы не знаете количество графиков, которые вы собираетесь построить, вы можете изменить цвета, как только вы нанесете их на график, получая номер непосредственно из графика, используя это .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)
TL; DR Нет, это не может быть сделано автоматически . Да, это возможно.
import matplotlib.pyplot as plt
my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))
Каждый участок ( 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]:
Так почему запрос ОП? Если мы продолжим читать, у нас есть
Не могли бы вы дать мне способ разместить разные цвета на разных графиках на одной фигуре?
и это имеет смысл, потому что каждый сюжет (каждый 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))
Если в этом смысл первоначального вопроса, одна из возможностей - явно назвать разные цвета для каждого сюжета.
Если графики (как это часто бывает) генерируются в цикле, мы должны иметь дополнительную переменную цикла, чтобы переопределить цвет, автоматически выбранный 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)
Другая возможность состоит в том, чтобы создать объект cycler
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))
Обратите внимание, что type(my_cycler)
есть, cycler.Cycler
но type(actual_cycler)
есть itertools.cycle
.
Я хотел бы предложить небольшое улучшение в последнем цикле ответа, приведенного в предыдущем посте (этот пост является правильным и все еще должен быть принят). Неявное предположение, сделанное при маркировке последнего примера, заключается в том, что 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)
set_color_cycle
он не рекомендуется, так что строка должна бытьplt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
и просто изменить вplt.cm.YOUR_PREFERED_COLOR_MAP
соответствии с вашими потребностями.