我有一堆图表,每个图表各有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)
Run Code Online (Sandbox Code Playgroud)
这是我可以从其他帖子中收集的内容:
plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) +
cycler('linestyle', ['-', '--', ':', '-.', '-', '--'])))
Run Code Online (Sandbox Code Playgroud)
注意我在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()
Run Code Online (Sandbox Code Playgroud)
您可能希望将两个循环器相乘:
plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) *
cycler('linestyle', ['-', '--', ':', '-.'])))
Run Code Online (Sandbox Code Playgroud)
如规定在这里,加入循环颜色和线型同时,而乘法混合所有属性.
在这种情况下,您不必使用重复的线条样式,因为颜色和线条样式不必具有相等的循环长度.
正如 @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
Run Code Online (Sandbox Code Playgroud)
请注意,乘法不可交换,并且会得到不同的结果。基本上,在第一种情况下,颜色是固定的,线型是变化的。在第二种情况下,线条样式是固定的,颜色会发生变化。总共 6x6 = 36 种可能性。
有了如此大量的曲线,您可以尝试更多的颜色和线条样式。
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
Run Code Online (Sandbox Code Playgroud)
结果如下: