How to set same color for markers and lines in a matplotlib plot loop?

后端 未结 3 1428
孤城傲影
孤城傲影 2021-02-05 05:52

I have to plot multiple lines and markers with matplotlib by creating a loop and I have already set the axes color cycle in the matplolibrc param file. In each cycle of the loop

相关标签:
3条回答
  • 2021-02-05 06:02

    Note that in matplotlib 1.5 onwards, color_cycle has been replaced by prop_cycler. The first option then needs:

    color = next(ax._get_lines.prop_cycler)['color']
    
    0 讨论(0)
  • 2021-02-05 06:17

    I present two ways. The first is probably cleaner: it loops through once, and within each loop, gets the next color, and then does two plotting commands with that color. In the second, it loops through and does all the markers and then it resets the colors and loops through again and does the lines.

    first method

    Directly access the color cycle. If matplotlib 1.5 or later use color=next(ax._get_lines.prop_cycler)['color']. Otherwise color=next(ax._get_lines.color_cycle):

    import numpy as np
    import itertools
    import matplotlib.pyplot as plt
    m = 5
    n = 5
    x = np.zeros(shape=(m, n))
    plt.figure(figsize=(5.15, 5.15))
    plt.clf()
    plt.subplot(111)
    marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p'))
    
    ax = plt.gca()
    for i in range(1, n):
        x = np.dot(i, [1, 1.1, 1.2, 1.3])
        y = x ** 2
        #
        #for matplotlib before 1.5, use
        #color = next(ax._get_lines.color_cycle)
        #instead of next line (thanks to Jon Loveday for the update)
        #
        color = next(ax._get_lines.prop_cycler)['color']
        plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next(), color=color)
        plt.plot(x, y, linestyle='-', color = color)
    plt.ylabel(r'$y$', labelpad=6)
    plt.xlabel(r'$x$', labelpad=6)
    plt.savefig('test2.png')
    

    Also, notice I changed your \textit{y} to $y$. Usually you actually want math fonts rather than italics.

    enter image description here

    second method

    If you don't want to send a color in as an argument, you can reset the color cycle and go through the loop twice. Here I reset it before the first loop and then again before the second loop just to make sure it's starting from the same place.

    import numpy as np
    import itertools
    import matplotlib.pyplot as plt
    m = 5
    n = 5
    x = np.zeros(shape=(m, n))
    plt.figure(figsize=(5.15, 5.15))
    plt.clf()
    plt.subplot(111)
    marker = itertools.cycle(('o', 'v', '^', '<', '>', 's', '8', 'p'))
    
    plt.gca().set_prop_cycle(None) #if matplotlib <1.5 use set_color_cycle
    for i in range(1, n):
        x = np.dot(i, [1, 1.1, 1.2, 1.3])
        y = x ** 2
        plt.plot(x, y, linestyle='', markeredgecolor='none', marker=marker.next())
    plt.gca().set_prop_cycle(None)
    for i in range(1, n):
        x = np.dot(i, [1, 1.1, 1.2, 1.3])
        y = x ** 2
        plt.plot(x, y, linestyle='-')
    plt.ylabel(r'$y$', labelpad=6)
    plt.xlabel(r'$x$', labelpad=6)
    plt.savefig('test.png')
    

    enter image description here

    0 讨论(0)
  • 2021-02-05 06:20

    Note that iter.next() was removed in Python 3.x as described in this question. If you run the examples in the accepted answer you will therefore receive AttributeError:

    'itertools.cycle' object has no attribute 'next'
    

    For both examples this can be solved by replacing:

    marker=marker.next()
    

    in plt.plot() with

    marker=next(marker)
    
    0 讨论(0)
提交回复
热议问题