简体   繁体   中英

matplotlib: 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!

Scatter plots have a facecolor and an edgecolor. The legend handler for a scatter is a PathCollection .

So you can loop over the legend handles and set the text color to the facecolor of the legend handle

for h, t in zip(leg.legendHandles, leg.get_texts()):
    t.set_color(h.get_facecolor()[0])

Complete code:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
for i in range(3):
    x,y = np.random.rand(2, 20)
    ax.scatter(x, y, label="Label {}".format(i))

leg = ax.legend()

for h, t in zip(leg.legendHandles, leg.get_texts()):
    t.set_color(h.get_facecolor()[0])

plt.show()

在此输入图像描述

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: 在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM