如何在matplotlib图形中循环显示颜色和线条样式?

11

我有一堆图表,每个图表上大约有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', ['-', '--', ':', '-.', '-', '--'])))
注意我在 linestyle cycler 中使用了重复的元素,否则会出现 ValueError 错误。
并且进行绘图。
plt.figure()
for i in range(20):
    plt.plot(x, ys[i], label=i)
plt.legend(loc=(1, 0.1))
plt.show()

在此输入图片描述

2个回答

8
你可能想要将这两个循环器相乘:
plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) *
                           cycler('linestyle', ['-', '--', ':', '-.'])))

此处所述,加法循环同时改变颜色和线条样式,而乘法混合所有属性。

在这种情况下,您不必使用重复的线条样式,因为颜色和线条样式不必具有相等的循环长度。


6

如@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

请注意,乘法不满足交换律,你会得到不同的结果。基本上,在第一种情况下,颜色是固定的,而线型发生变化。在第二种情况下,线型是固定的,而颜色发生变化。总共有6x6=36种可能性。
有这么多曲线,你可以尝试使用更多的颜色和线型进行实验。
图1:cycler_op1 图2: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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接