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], ['$D_{etc}$'] + categories + [
    '$A_{etc}$'] + categories, loc=2, ncol=2)
leg4 = legend([p5, p7, p5, p7, p1, p2, p3, p4], ['$D_{etc}$', '',
    '$A_{etc}$', ''] + categories + categories, loc=4, ncol=2)
gca().add_artist(leg3)
show()
Subheadings for categories within matplotlib custom legend