Відповіді:
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
за мовою Матплотліба) має свій власний 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)
Інша можливість - інстанціювати циклічний об'єкт
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
до ваших потреб.