如何在matplotlib绘图循环中为标记和线设置相同的颜色?

Tom*_*gal 17 python 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()
Run Code Online (Sandbox Code Playgroud)

使用此代码我得到的输出是:

在此输入图像描述

我需要在它们的范围内绘制的标记和线具有相同的颜色.如何在matplotlib中完成?

Joe*_*oel 28

我提出两种方式.第一个可能更干净:它循环一次,并在每个循环中获得下一个颜色,然后使用该颜色执行两个绘图命令.在第二个中,它循环并完成所有标记,然后重置颜色并再次循环并完成线条.

第一种方法

直接访问颜色循环.如果matplotlib 1.5或更高版本使用 color=next(ax._get_lines.prop_cycler)['color'].否则color=next(ax._get_lines.color_cycle):

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')
Run Code Online (Sandbox Code Playgroud)

另外,请注意我改变你\textit{y}$y$.通常你真的想要数学字体而不是斜体字.

在此输入图像描述

第二种方法

如果您不想将颜色作为参数发送,则可以重置颜色循环并循环两次.在这里,我在第一个循环之前重置它,然后在第二个循环之前再次重置它,以确保它从同一个地方开始.

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_prop_cycle(None) #if matplotlib <1.5 use set_color_cycle
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_prob_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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 5

请注意,在 matplotlib 1.5 之后,color_cycle 已被 prop_cycler 取代。然后第一个选项需要:

color = next(ax._get_lines.prop_cycler)['color']
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我非常基本的解决方案:

只需读取上一个图中的颜色,.get_color()然后将其交给带有关键字的下一个图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'))
for i in range(1, n):
    x = np.dot(i, [1, 1.1, 1.2, 1.3])
    y = x ** 2
    lines = plt.plot(x, y, linestyle='', markeredgecolor='none', marker=next(marker))
    linecolor = lines[0].get_color()
    plt.plot(x, y, linestyle='-',color=linecolor)
plt.ylabel(r'$y$', labelpad=6)
plt.xlabel(r'$x$', labelpad=6)
plt.show()
Run Code Online (Sandbox Code Playgroud)

如中所述正如此答案,代码已更新为在 Python 3.x 中运行。

您还可以通过此处演示的plt.plot关键字获得您想要的内容。markevery=...