TL; DR
import matplotlib.pyplot as plt
from cycler import cycler
monochrome = (cycler('color', ['k']) * cycler('marker', ['', '.']) *
cycler('linestyle', ['-', '--', ':', '=.']))
plt.rc('axes', prop_cycle=monochrome)
Расширенный ответ
Более новые matplotlib
релизы представили новую rcParams
, а именно axes.prop_cycle
In [1]: import matplotlib.pyplot as plt
In [2]: plt.rcParams['axes.prop_cycle']
Out[2]: cycler('color', ['b', 'g', 'r', 'c', 'm', 'y', 'k'])
Для предустановленных стилей, доступных plt.style.use(...)
или with plt.style.context(...):
, prop_cycle
эквивалентен традиционному и устарел axes.color_cycle
In [3]: plt.rcParams['axes.color_cycle']
/.../__init__.py:892: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.
warnings.warn(self.msg_depr % (key, alt_key))
Out[3]: ['b', 'g', 'r', 'c', 'm', 'y', 'k']
, но объект cycler
имеет гораздо больше возможностей, в частности, комплекс cycler
может быть составлен из более простых, ссылаясь на различные свойства, используя +
и *
, что означает соответственно zip и декартово произведение.
Здесь мы импортируем вспомогательную функцию cycler
, определяем 3 простых cycler
, которые ссылаются на различные свойства и, наконец, составляем их, используя декартово произведение
In [4]: from cycler import cycler
In [5]: color_c = cycler('color', ['k'])
In [6]: style_c = cycler('linestyle', ['-', '--', ':', '-.'])
In [7]: markr_c = cycler('marker', ['', '.', 'o'])
In [8]: c_cms = color_c * markr_c * style_c
In [9]: c_csm = color_c * style_c * markr_c
Здесь у нас есть два разных (?) Комплекса cycler
и да, они разные, потому что эта операция некоммутативна, смотрите
In [10]: for d in c_csm: print('\t'.join(d[k] for k in d))
- k
- . k
- o k
-- k
-- . k
-- o k
: k
: . k
: o k
-. k
-. . k
-. o k
In [11]: for d in c_cms: print('\t'.join(d[k] for k in d))
- k
-- k
: k
-. k
- . k
-- . k
: . k
-. . k
- o k
-- o k
: o k
-. o k
Элементарный цикл, который изменяется быстрее, является последним в продукте и т. Д., Это важно, если мы хотим определенного порядка в стиле линий.
Как использовать состав cycler
с? С помощью plt.rc
или эквивалентного способа изменить rcParams
из matplotlib
. Например.,
In [12]: %matplotlib
Using matplotlib backend: Qt4Agg
In [13]: import numpy as np
In [14]: x = np.linspace(0, 8, 101)
In [15]: y = np.cos(np.arange(7)+x[:,None])
In [16]: plt.rc('axes', prop_cycle=c_cms)
In [17]: plt.plot(x, y);
In [18]: plt.grid();
Конечно, это всего лишь пример, и OP может смешивать и сочетать различные свойства для достижения наиболее приятного визуального вывода.
PS Я забыл упомянуть, что этот подход автоматически обрабатывает образцы строк в окне легенды,