如何在Matplotlib图表中同时循环颜色与线型生成唯一线条?
解决Matplotlib循环颜色与线型仅生成6种样式的问题
嘿,我来帮你揪出问题的根源!你想要用6种颜色+4种线型生成大量唯一线条,但代码只输出6种,核心原因是你用错了cycler的组合运算符。
问题出在哪?
你用了+来拼接颜色和线型的cycler,但+的作用是把两个cycler的元素按位置一一配对合并,而不是生成所有可能的颜色×线型组合。
看你写的配置代码:
plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) + cycler('linestyle', ['-', '--', ':', '-.', '-', '--'])))
这里颜色cycler有6个元素,你为了避免报错把线型cycler也凑成了6个(重复了-和--),+会让它们一一绑定:
- 第1条:红色+实线
- 第2条:绿色+虚线
- ...
- 第6条:黑色+虚线
从第7条开始就会重复第1条的组合,自然只有6种样式。
正确的做法
如果你想要颜色和线型的所有组合(笛卡尔积),应该用*运算符来组合cycler,它会自动生成 6种颜色 × 4种线型 = 24种 唯一的线条样式,完全覆盖你20条曲线的需求,而且不需要重复线型。
修正后的完整代码
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', ['-', '--', ':', '-.']))) plt.figure() for i in range(20): plt.plot(x, ys[i], label=i) plt.legend(loc=(1, 0.1)) plt.show()
运行这段代码后,曲线会按「红色+实线→红色+虚线→红色+点线→红色+点划线→绿色+实线→绿色+虚线……」的顺序循环,20条曲线都能拥有唯一的线条样式。
内容的提问来源于stack exchange,提问作者CiaranWelsh
相关产品推荐
相关产品推荐

