Search code examples
pythonmatplotliblegendscatter-plot

Match legend text color with symbol in scatter plot


I made a scatter plot with 3 different colors and I want to match the color of the symbol and the text in the legend.

A nice solution exist for the case of line plots:

leg = ax.legend()

# change the font colors to match the line colors:
for line,text in zip(leg.get_lines(), leg.get_texts()):
    text.set_color(line.get_color())

However, scatter plot colors cannot be accessed by get_lines().For the case of 3 colors I think I can manually set the text colors one-by-one using eg. text.set_color('r'). But I was curious if it can be done automatically as lines. Thanks!


Solution

  • This seems complicated but does give you what you want. Suggestions are welcomed. I use ax.get_legend_handles_labels() to get the markers and use tuple(handle.get_facecolor()[0]) to get the matplotlib color tuple. Made an example with a really simple scatter plot like this:

    Edit:

    As ImportanceOfBeingErnest pointed in his answer:

    1. leg.legendHandles will return the legend handles;
    2. List, instead of tuple, can be used to assign matplotlib color.

    Codes are simplified as:

    import matplotlib.pyplot as plt
    from numpy.random import rand
    
    
    fig, ax = plt.subplots()
    for color in ['red', 'green', 'blue']:
        x, y = rand(2, 10)
        ax.scatter(x, y, c=color, label=color)
    
    leg = ax.legend()
    for handle, text in zip(leg.legendHandles, leg.get_texts()):
        text.set_color(handle.get_facecolor()[0])
    
    plt.show()
    

    What I got is: enter image description here