Home > Blockchain >  Add a second legend to display markers - matplotlib
Add a second legend to display markers - matplotlib

Time:05-12

I am attempting to add a 2nd legend to display the max values (via markers).

However, only the marker type in mrkr is given in the 2nd legend and not the desired symbol corresponding to mrkr.

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

np.random.seed(0)
df0 = pd.DataFrame(np.random.randint(0,1000,size=(18, 4)), 
columns=list('ABCD'))
ax = df0.plot()

mrkr = ['o', '.', 'v', 'x']
mrkr_df = pd.DataFrame(mrkr)

idx_mx_vals = df0.abs().idxmax().to_list()

mx_vals = df0.to_numpy()[idx_mx_vals, 
np.arange(len(idx_mx_vals))].tolist()

for x, y, m, line in zip(idx_mx_vals, mx_vals, mrkr, ax.lines):
    line2 = ax.plot(x, y, marker=m, c=line.get_color(), markersize=20)

leg1 = ax.legend(loc='upper right')
leg2 = ax.legend(mrkr, loc='lower right')
# manually return leg1
ax.add_artist(leg1)

Desired Output:

2nd legend showing the markers with its symbol.

enter image description here

CodePudding user response:

legend_elements = []
for x, y, m, line in zip(idx_mx_vals, mx_vals, mrkr, ax.lines):
    line2 = ax.plot(x, y, marker=m, c=line.get_color(), markersize=20)
    legend_elements.append(Line2D([0], [0], c=line.get_color(), marker=m, label=m))

leg1 = ax.legend(loc='upper right')
leg2 = ax.legend(handles=legend_elements, loc='lower right')
  • Related