Ответ на ваш вопрос связан с двумя другими вопросами SO.
Ответ на Как выбрать новый цвет для каждой построенной линии на рисунке в matplotlib? объясняет, какопределить список цветов по умолчанию, который циклически проходит, чтобы выбрать следующий цвет для построения.Это делается с помощью метода Axes.set_color_cycle
.
Однако вы хотите получить правильный список цветов, и это проще всего сделать с помощью карты цветов, как объясняется в ответе на этот вопрос: Создать генератор цветов из заданной карты цветов в matplotlib.Там цветовая карта принимает значение от 0 до 1 и возвращает цвет.
Итак, для ваших 20 строк вы хотите переключаться с 0 на 1 с шагом 1/20.В частности, вы хотите циклически изменить форму от 0 до 19/20, потому что 1 отображается обратно в 0.
Это сделано в этом примере:
import matplotlib.pyplot as plt
import numpy as np
NUM_COLORS = 20
cm = plt.get_cmap('gist_rainbow')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_color_cycle([cm(1.*i/NUM_COLORS) for i in range(NUM_COLORS)])
for i in range(NUM_COLORS):
ax.plot(np.arange(10)*(i+1))
fig.savefig('moreColors.png')
plt.show()
Это результирующий показатель:
Альтернативное, лучшее (дискуссионное) решение
Существует альтернативный способ использования объекта ScalarMappable
для преобразования диапазона значений вцвета.Преимущество этого метода заключается в том, что вы можете использовать нелинейный Normalization
для преобразования из индекса строки в фактический цвет.Следующий код дает тот же точный результат:
import matplotlib.pyplot as plt
import matplotlib.cm as mplcm
import matplotlib.colors as colors
import numpy as np
NUM_COLORS = 20
cm = plt.get_cmap('gist_rainbow')
cNorm = colors.Normalize(vmin=0, vmax=NUM_COLORS-1)
scalarMap = mplcm.ScalarMappable(norm=cNorm, cmap=cm)
fig = plt.figure()
ax = fig.add_subplot(111)
# old way:
#ax.set_color_cycle([cm(1.*i/NUM_COLORS) for i in range(NUM_COLORS)])
# new way:
ax.set_color_cycle([scalarMap.to_rgba(i) for i in range(NUM_COLORS)])
for i in range(NUM_COLORS):
ax.plot(np.arange(10)*(i+1))
fig.savefig('moreColors.png')
plt.show()
Примечание об устаревании
В более поздних версиях mplib (1.5+) функция set_color_cycle
былаустарел в пользу ax.set_prop_cycle(color=[...])
.