Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Subheadings for categories within matplotlib custom legend

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.

like image 227
Edward Newell Avatar asked Feb 05 '14 06:02

Edward Newell


1 Answers

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

like image 108
cphlewis Avatar answered Oct 23 '22 14:10

cphlewis