Как установить одинаковый цвет для маркеров и линий в цикле графика matplotlib?

Мне нужно построить несколько строк и маркеров с помощью matplotlib, создав цикл, и я уже установил цикл цвета осей в файле matplolibrc param. В каждом цикле цикла создается набор маркеров и строк (строки создаются отдельной командой). Но цвета маркера и линии различаются в зависимости от цветового цикла осей. Я хочу, чтобы каждый раз, когда цикл запускал маркер и строки одного цвета этого цикла.

Я включил воспроизводимый код:

import numpy as np
import itertools
import matplotlib.pyplot as plt
m = 5
n = 5
x = np.zeros(shape=(m, n))
plt.figure(figsize=(5.15, 5.15))
plt.clf()
plt.subplot(111)
marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p'))
for i in range(1, n):
    x = np.dot(i, [1, 1.1, 1.2, 1.3])
    y = x ** 2
    plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next())
    plt.plot(x, y, linestyle='-')
plt.ylabel(r'\textit{y}', labelpad=6)
plt.xlabel(r'\textit{x}', labelpad=6)
plt.show()

Используя этот код, я получаю:

enter image description here

Мне нужны маркеры и линии, построенные в их диапазоне, одного цвета. Как это можно сделать в matplotlib?

Ответ 1

Я представляю два пути. Во-первых, он прокручивается и выполняет все маркеры, а затем сбрасывает цвета и снова контуров, а также линии. Второй, вероятно, более чистый: он циклически проходит один раз и внутри каждого цикла получает следующий цвет, а затем выполняет две команды построения графика с этим цветом.

первый метод

Если вы не хотите отправлять цвет в качестве аргумента, вы можете reset цикл цвета и дважды пройти цикл. Здесь я reset это перед первым циклом, а затем снова перед вторым циклом, чтобы убедиться, что он начинается с того же места.

import numpy as np
import itertools
import matplotlib.pyplot as plt
m = 5
n = 5
x = np.zeros(shape=(m, n))
plt.figure(figsize=(5.15, 5.15))
plt.clf()
plt.subplot(111)
marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p'))

plt.gca().set_color_cycle(None)
for i in range(1, n):
    x = np.dot(i, [1, 1.1, 1.2, 1.3])
    y = x ** 2
    plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next())
plt.gca().set_color_cycle(None)
for i in range(1, n):
    x = np.dot(i, [1, 1.1, 1.2, 1.3])
    y = x ** 2
    plt.plot(x, y, linestyle='-')
plt.ylabel(r'$y$', labelpad=6)
plt.xlabel(r'$x$', labelpad=6)
plt.savefig('test.png')

enter image description here

ВТОРАЯ ОПЦИЯ

Прямой доступ к цветовому циклу с помощью color=next(ax._get_lines.prop_cycler)['color']:

import numpy as np
import itertools
import matplotlib.pyplot as plt
m = 5
n = 5
x = np.zeros(shape=(m, n))
plt.figure(figsize=(5.15, 5.15))
plt.clf()
plt.subplot(111)
marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p'))

ax = plt.gca()
for i in range(1, n):
    x = np.dot(i, [1, 1.1, 1.2, 1.3])
    y = x ** 2
    #
    #for matplotlib before 1.5, use
    #color = next(ax._get_lines.color_cycle)
    #instead of next line (thanks to Jon Loveday for the update)
    #
    color = next(ax._get_lines.prop_cycler)['color']
    plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next(), color=color)
    plt.plot(x, y, linestyle='-', color = color)
plt.ylabel(r'$y$', labelpad=6)
plt.xlabel(r'$x$', labelpad=6)
plt.savefig('test2.png')

Также обратите внимание, что я изменил ваш \textit{y} на $y$. Обычно вы действительно хотите использовать математические шрифты, а не курсив.

enter image description here

Ответ 2

Обратите внимание, что в matplotlib 1.5 и color_cycle был заменен prop_cycler. Затем требуется второй вариант:

color = next(ax._get_lines.prop_cycler)['color']