Get matplotlib color cycle state

后端 未结 9 1597
慢半拍i
慢半拍i 2020-11-27 10:36

Is it possible to query the current state of the matplotlib color cycle? In other words is there a function get_cycle_state that will behave in the following wa

9条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-27 11:14

    Sure, this will do it.

    #rainbow
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0,2*np.pi)
    ax= plt.subplot(1,1,1)
    ax.plot(np.sin(x))
    ax.plot(np.cos(x))
    
    rainbow = ax._get_lines.color_cycle
    print rainbow
    for i, color in enumerate(rainbow):
        if i<10:
            print color,
    

    Gives:

    
    r c m y k b g r c m
    

    Here is the itertools function that matplotlib uses itertools.cycle

    Edit: Thanks for the comment, it seems that it is not possible to copy an iterator. An idea would be to dump a full cycle and keep track of which value you are using, let me get back on that.

    Edit2: Allright, this will give you the next color and make a new iterator that behaves as if next was not called. This does not preserve the order of coloring, just the next color value, I leave that to you.

    This gives the following output, notice that steepness in the plot corresponds to index, eg first g is the bottomest graph and so on.

    #rainbow
    
    import matplotlib.pyplot as plt
    import numpy as np
    import collections
    import itertools
    
    x = np.linspace(0,2*np.pi)
    ax= plt.subplot(1,1,1)
    
    
    def create_rainbow():
        rainbow = [ax._get_lines.color_cycle.next()]
        while True:
            nextval = ax._get_lines.color_cycle.next()
            if nextval not in rainbow:
                rainbow.append(nextval)
            else:
                return rainbow
    
    def next_color(axis_handle=ax):
        rainbow = create_rainbow()
        double_rainbow = collections.deque(rainbow)
        nextval = ax._get_lines.color_cycle.next()
        double_rainbow.rotate(-1)
        return nextval, itertools.cycle(double_rainbow)
    
    
    for i in range(1,10):
        nextval, ax._get_lines.color_cycle = next_color(ax)
        print "Next color is: ", nextval
        ax.plot(i*(x))
    
    
    plt.savefig("SO_rotate_color.png")
    plt.show()
    

    Console

    Next color is:  g
    Next color is:  c
    Next color is:  y
    Next color is:  b
    Next color is:  r
    Next color is:  m
    Next color is:  k
    Next color is:  g
    Next color is:  c
    

    Rotate color

提交回复
热议问题