Как перебрать цвета и стили линий на фигуре matplotlib? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть несколько графиков с примерно 15-20 строками на каждом. Я хотел бы перебирать цвета и стили линий, чтобы получить много уникальных линий. Если я использую 6 цветов и 4 стиля линии, должно быть 20 уникальных строк, однако приведенный ниже код выдает только 6. Что я делаю неправильно?

Вот поддельный набор данных

import matplotlib.pyplot as plt
from cycler import cycler
import numpy
import seaborn
seaborn.set_style('white')

x = range(10)
ys = []
for i in range(20):
    ys.append(numpy.random.uniform(1, 10, size=10)*i)

Вот что я могу почерпнуть из других сообщений:

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) +
                           cycler('linestyle', ['-', '--', ':', '-.', '-', '--'])))

Примечание. Я использовал дубликаты в цикле линейного стиля, в противном случае мы получим ValueError.

И черчение

plt.figure()
for i in range(20):
    plt.plot(x, ys[i], label=i)
plt.legend(loc=(1, 0.1))
plt.show()

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Как уже упоминалось @datasailor, вы должны умножить оба цикла:

cycler_op1 = cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) \
            * cycler('linestyle', ['-', '--', ':', '-.', '-', '--'])

cycler_op2 = cycler('linestyle', ['-', '--', ':', '-.', '-', '--']) \
            * cycler('color', ['r', 'g', 'b', 'y', 'c', 'k'])

rc('axes', prop_cycle = cycler_op1 ) # or cycler_op2

Обратите внимание, что умножение не является коммутативным, и вы получите другой результат. По сути, в первом случае цвет фиксируется, а стиль линий изменяется. Во втором случае стиль линии фиксируется, а цвет меняется. Всего 6х6 = 36 возможностей.

cycler_op1

cycler_op2

При таком большом количестве кривых вы можете поэкспериментировать с большим количеством цветов и стилей линий.

ls_cycler = cycler('linestyle',
                    [(0,()), # solid 
                     (0, (1, 10)), # loosely dotted
                     (0, (1, 5)), # dotted
                     (0, (1, 1)), # densely dotted
                     (0, (5, 10)), # loosely dashed
                     (0, (5, 5)), # dashed
                     (0, (5, 1)), # densely dashed
                     (0, (3, 10, 1, 10)), # loosely dashdotted
                     (0, (3, 5, 1, 5)), # dashdotted
                     (0, (3, 1, 1, 1)), # densely dashdotted
                     (0, (3, 10, 1, 10, 1, 10)), # loosely dashdotdotted
                     (0, (3, 5, 1, 5, 1, 5)), # dashdotdotted
                     (0, (3, 1, 1, 1, 1, 1))] # densely dashdotdotted
                  )

color_cycler = cycler('color', [plt.get_cmap('jet')(i/13) for i in range(13)] )

new_cycler = color_cycler + ls_cycler

Результат выглядит так:

new_cycler

0 голосов
/ 16 мая 2018

Вы, вероятно, хотите умножить два цикла:

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) *
                           cycler('linestyle', ['-', '--', ':', '-.'])))

как указано здесь , сложение циклически изменяет и цвет, и стиль линии одновременно, а умножение смешивает все свойства.

В этом случае вам не нужно использовать дублированные стили линий, поскольку цвет и стиль линий не должны иметь одинаковую длину цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...