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

后端 未结 3 1435
孤城傲影
孤城傲影 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: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

提交回复
热议问题