Matplotlib的颜色和线条周期问题

时间:2018-07-20 08:38:56

标签: python matplotlib

我正在写一个小类,其中包含所有适合我需要的参数, 但是当我定义要完成的3个周期时遇到了一个问题。 我要做的是:定义3种循环类型(cycle0,cycle1,cycle2),然后在包含多个rcParams的字典中设置'axes.prop_cycle' 这三个周期定义如下:

cycle0 =  plt.cycler("color", colors)         
cycle1 = plt.cycler("color", colors) + plt.cycler("linestyle", linestyles)
cycle2 = plt.cycler("color", colors) * plt.cycler("linestyle", linestyles)

当我选择使用cycle0时,问题出现了:

'axes.prop_cycle': cycle0, 

和颜色(我选择的颜色)的长度在线型方面有所不同,但使用cycle0时,我将不使用线型! 我该如何解决这个问题?到目前为止,当我不得不使用cycle0时,我必须注释掉cycle1;当我想使用它的

时,我必须注释掉cycle1。

编辑 错误是这个:

ValueError: Can only add equal length cycles, not 6 and 8

但是在myparams定义中,我使用

'axes.prop_cycle': cycle0,

编辑 最小可编译示例:

import numpy as np
import matplotlib.pyplot as plt

def _plot(*args,**kwargs):

    linestyles  = [(0, ()),(0, (1, 1)),(0, (5, 10)),(0, (5, 5)),(0, (5, 1)),(0, (3, 10, 1, 10)),(0, (3, 5, 1, 5)),(0, (3, 5, 1, 5, 1, 5)) ]
    colors      = ['#3B4CC0','#7C9FF9','#C0D4F5','#F2CBB7','#EE8568','#B40426']

    variable = [*args]
    if len(variable) % 3 != 0:
      print('Error variable must be coupled (even number)')
      raise AttributeError('you must give 2 array x,y followed by string label for each plot')

    parameters = {**kwargs} 

    cycle0 =  plt.cycler("color", colors) 
    cycle1 = plt.cycler("color", colors) + plt.cycler("linestyle", linestyles)
    cycle2 = plt.cycler("color", colors) * plt.cycler("linestyle", linestyles)


    myparams = {
        'axes.prop_cycle': cycle0  
     }

    plt.rcParams.update(myparams)
    fig,ax = plt.subplots(1,figsize=(7,4.2))

    for i in range(0,len(variable)-1,3):
            plt.plot(variable[i],variable[i+1], linewidth=3, label= variable[i+2])
    plt.grid(linestyle='--', dashes=(5,7))
    plt.show() 



def main():

    x  = np.linspace(0,2*np.pi,100)
    y1 = np.sin(x) 
    y2 = np.sin(2*x)
    y3 = np.sin(4*x)

    _plot(x,y1,'sin(x)',x,y2,'sin(2x)',x,y3,'sin(3x)')


if __name__ == '__main__' :
    main()

如果您改为评论cycle1,则此方法有效!

编辑也许我不太清楚,这段代码(cycle1)是我使用的一个周期 用不同的颜色方案..我所报告的只是一个例子,说:

如果我也使用rcParams列表中的cycle0(这里我已经报告过),则只是蓝色到红色的方案。但是在我的课程中,有很多颜色方案和很多线型..出现在

中的参数
myparams = {
        ......
        'axes.prop_cycle': cycle0  
        ......
         }

是从字典中给出的(看起来是_plot的定义),我想弄清楚,这是将cycle1作为我的'axes.prop_cycle'选项的一种方式,这样我可以在不加注释的情况下切换或取消注释该行代码(cycle1 ....)

1 个答案:

答案 0 :(得分:2)

问题出在cycle1中,而不是cycle0中。您可以删除该行,因为代码中从未使用过它。
否则,您需要确保具有相等长度的循环器。

例如,您可以在颜色循环中再添加两种颜色

colors = ['#3B4CC0','#7C9FF9','#C0D4F5','#F2CBB7','#EE8568','#B40426', "red", "limegreen"]

使得线型和颜色都具有8个元素。