【问题标题】:How to cycle through both colours and linestyles on a matplotlib figure?如何在 matplotlib 图形上循环显示颜色和线条样式?
【发布时间】:2018-05-17 06:06:19
【问题描述】:

我有一堆图表,每个图表大约有 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 循环器中使用了重复项,否则我们会得到 ValueError。

和绘图

plt.figure()
for i in range(20):
    plt.plot(x, ys[i], label=i)
plt.legend(loc=(1, 0.1))
plt.show()

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您可能希望将两个循环仪相乘:

    plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) *
                               cycler('linestyle', ['-', '--', ':', '-.'])))
    

    here 所述,加法同时循环颜色和线型,而乘法混合所有属性。

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

    【讨论】:

      【解决方案2】:

      正如@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 种可能性。

      有了这么多的曲线,您可以尝试更多的颜色和线条样式。

      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
      

      结果如下所示:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多