Как выбрать новый цвет для каждой нанесенной линии на фигуре в matplotlib?
Я не хочу указывать цвет для каждой нанесенной линии:
for i in range(20):
ax1.plot(x, y)
Если вы посмотрите на изображение для этого, matplotlib попытается выбрать цвета для каждой линии, которые отличаются, но в конечном итоге он повторно использует цвета. Я просто хочу, чтобы он не повторял уже использованные цвета И / ИЛИ не выдавал список используемых цветов.
8 ответов
Я обычно использую 3-й из этих 3-х, также я не проверял 1 и 2 версию.
from matplotlib.pyplot import cm
import numpy as np
#variable n should be number of curves to plot (I skipped this earlier thinking that it is obvious when looking at picture - sorry my bad mistake xD): n=len(array_of_curves_to_plot)
#version 1:
color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
ax1.plot(x, y,c=c)
#or version 2: - faster and better:
color=iter(cm.rainbow(np.linspace(0,1,n)))
c=next(color)
plt.plot(x,y,c=c)
#or version 3:
color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
c=next(color)
ax1.plot(x, y,c=c)
пример 3:
Вы можете использовать предопределенную "качественную цветовую карту" следующим образом:
from matplotlib.cm import get_cmap
name = "Accent"
cmap = get_cmap(name) # type: matplotlib.colors.ListedColormap
colors = cmap.colors # type: list
axes.set_prop_cycle(color=colors)
Проверено на matplotlib 3.0.3. См. https://github.com/matplotlib/matplotlib/issues/10840 для обсуждения того, почему вы не можете позвонить axes.set_prop_cycle(color=cmap)
,
Список предопределенных качественных цветовых карт доступен по адресу https://matplotlib.org/gallery/color/colormap_reference.html:
prop_cycle
color_cycle
было признано устаревшим в 1.5 в пользу этого обобщения: http://matplotlib.org/users/whats_new.html
# cycler is a separate package extracted matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt
plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()
Также показано в примере (который теперь называется плохо): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html упомянутый по адресу: /questions/5610650/kak-vyibrat-novyij-tsvet-dlya-kazhdoj-nanesennoj-linii-na-figure-v-matplotlib/5610663#5610663
Проверено в matplotlib 1.5.1.
Я не знаю, можете ли вы автоматически изменить цвет, но вы можете использовать свой цикл для создания разных цветов:
for i in range(20):
ax1.plot(x, y, color = (0, i / 20.0, 0, 1)
В этом случае цвета будут варьироваться от черного до 100% зеленого, но вы можете настроить его, если хотите.
Посмотрите документы matplotlib plot() и найдите color
Ключевой аргумент.
Если вы хотите заполнить список цветов, просто убедитесь, что у вас достаточно большой список, а затем используйте индекс цикла, чтобы выбрать цвет
colors = ['r', 'b', ...., 'w']
for i in range(20):
ax1.plot(x, y, color = colors[i])
Как отмечает Чиро, вы можете использоватьprop_cycle
чтобы установить список цветов для цикла matplotlib. Но сколько цветов? Что, если вы хотите использовать один и тот же цветовой цикл для множества графиков с разным количеством линий?
Одна из тактик заключается в использовании формулы, подобной той из /questions/44129518/sql-server-ne-ispolzuetsya-no-vyideleno-tablichnoe-prostranstvo/44129519#44129519, для генерации бесконечной последовательности цветов, в которой каждый цвет пытается значительно отличаться от всех предшествующих.
К сожалению, prop_cycle
не принимает бесконечные последовательности - он будет зависать вечно, если вы передадите ему одну. Но мы можем взять, скажем, первые 1000 цветов, сгенерированных из такой последовательности, и установить их как цветовой цикл. Таким образом, для графиков с любым нормальным количеством линий вы должны получить различимые цвета.
Пример:
from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler
# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))
for i in range(20):
plt.plot([1, 0], [i, i])
plt.show()
Выход:
Теперь все цвета разные - хотя я признаю, что мне трудно различить некоторые из них!
-
matplotlib.cm.get_cmap
иmatplotlib.pyplot.cm.get_cmap
устарели сmatplotlib 3.7.0
- Использовать
matplotlib.colormaps[name]
илиmatplotlib.colormaps.get_cmap(obj)
вместо. -
.get_cmap
больше не имеетlut
параметр. Вместо этого используйте.resampled
-
cmap = mpl.colormaps.get_cmap('viridis').resampled(20)
создаетmatplotlib.colors.ListedColormap
объект.- Также
cmap = mpl.colormaps['viridis'].resampled(20)
- Также
-
colors = mpl.colormaps.get_cmap('viridis').resampled(20).colors
создать массив номеров цветов.
import matplotlib as mpl
import matplotlib.pyplot as mpl
import numpy as np
colors = mpl.colormaps.get_cmap('viridis').resampled(20).colors
for i, color in enumerate(colors):
plt.plot([0, 1], [i, i], color=color)
plt.show()
- Как объяснено в разделе «Почему структура цветовых карт Matplotlib отличается?»,
.colors
извлечет массив цветов изListedColormap
, но не работает сLinearSegmentedColormap
, например, показанные в разделе «Разные цветовые карты» . - Обходной путь — использовать
colors = cmap(np.arange(0, cmap.N))
cmap = mpl.colormaps.get_cmap('summer').resampled(20)
colors = cmap(np.arange(0, cmap.N))
for i, color in enumerate(colors):
plt.plot([0, 1], [i, i], color=color)
plt.show()
Вы также можете изменить цветовой цикл по умолчанию в вашем matplotlibrc
файл. Если вы не знаете, где находится этот файл, выполните в Python следующее:
import matplotlib
matplotlib.matplotlib_fname()
Это покажет вам путь к вашему текущему используемому файлу matplotlibrc. В этом файле вы найдете среди многих других настроек также один для axes.color.cycle
, Просто введите желаемую последовательность цветов, и вы найдете ее на каждом сюжете, который вы делаете. Обратите внимание, что вы также можете использовать все допустимые имена цветов html в matplotlib.