I am trying to understand how to use the legend() better, specifically how to use proxy artists. I find the Legend guide to be severely lacking. This post is somewhat simila
I'm still using matplotlib 1.2.1 so I'll tell you what works for me. I find that if I pass the line objects to legend(), I also have to pass the labels separately. [This is also consistent with the matplotlib documentation on legened()]. I've modified your example slightly to do this, and it seems to work:
import matplotlib.patches as mpatches
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
line_up, = plt.plot([1,2,3], label='Line 2')
line_down, = plt.plot([3,2,1], label='Line 1')
blue_line = mlines.Line2D([], [], color='blue', marker='*',
markersize=15, label='Blue stars')
red_patch = mpatches.Patch(color='red', label='The red data')
lines = [blue_line, red_patch]
labels = [line.get_label() for line in lines]
plt.legend(lines, labels)
plt.show()
The Legend Guide was rewritten to be compatible with matplotlib version 1.4.0 or newer. Your version of matplotlib (1.2.1) is over two years old. Don't be surprised if everything shown in the docs does not work with such an old version.
If you upgrade your version, then using
plt.legend(handles=[red_patch,blue_line])
(as is shown in the Legend Guide) instead of
plt.legend([red_patch,blue_line])
yields