14
votes

I have a a figure that looks like this:

enter image description here

I'd like to make a legend that looks like this:

enter image description here

How can I do that?


UPDATE:

Note that this legend has a frame with an edgecolor: a valid answer will include this. The legend should also be embedded in the axes.

The legend I want might not be achievable using ax.legend(). A great answer would be one which shows how to build my desired legend (exactly as shown) manually with patches and texts, or whatever matplotlib methods that make sense.

1
1. Make an ordinary legend. 2. Add DEF and ABC as labels.sashkello
What about the the frame?Edward Newell
Remove frame, put it on separately as well.sashkello
As an afterthought - you've already done it! Just save it as a picture and place it on the plot. Done :)sashkello
What I'm trying to say is that you have some custom structure, which is not really qualified as "legend" any more. All you can do is construct it yourself from pieces...sashkello

1 Answers

20
votes

Separate headings for D and A lines:

from matplotlib.pyplot import *
ds = [1,2,3]
dc = [1.1, 1.9, 3.2]
asim = [1.5, 2.2, 3.1]
ac = [1.6, 2.15, 3.1]

categories = ['simulated', 'calculated']

p1, = plot(ds, 'ko', label='D simulated')
p2, = plot(dc, 'k:', label='D calculated')
p3, = plot(asim, 'b+', label='A simulated')
p4, = plot(ac, 'b-', label='A calculated')
p5, = plot([0], marker='None',
           linestyle='None', label='dummy-tophead')
p7, = plot([0],  marker='None',
           linestyle='None', label='dummy-empty')

leg3 = legend([p5, p1, p2, p5, p3, p4],
              [r'$D_{etc}$'] + categories + [r'$A_{etc}$'] + categories,
              loc=2, ncol=2) # Two columns, vertical group labels

leg4 = legend([p5, p7, p5, p7, p1, p2, p3, p4],
              [r'$D_{etc}$', '', r'$A_{etc}$', ''] + categories + categories,
              loc=4, ncol=2) # Two columns, horizontal group labels

gca().add_artist(leg3)

#If there isn't a big empty spot on the plot, two legends:
#leg1 = legend([p1, p2], categories, title='D_etc', loc=0)
#leg2 = legend([p3, p4], categories, title='A_etc', loc=4)
#gca().add_artist(leg2) 

show()

Two options for a grouped legend