From 1a8c541784ca52902096279e7e47123e82e62f1a Mon Sep 17 00:00:00 2001 From: AmyTeegarden Date: Thu, 23 Jul 2015 13:01:24 -0700 Subject: [PATCH] NF - New legend example with line collection --- examples/pylab_examples/legend_demo5.py | 71 +++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 examples/pylab_examples/legend_demo5.py diff --git a/examples/pylab_examples/legend_demo5.py b/examples/pylab_examples/legend_demo5.py new file mode 100644 index 000000000000..699babe2b631 --- /dev/null +++ b/examples/pylab_examples/legend_demo5.py @@ -0,0 +1,71 @@ +from __future__ import (absolute_import, division, + print_function, unicode_literals) +import six +from matplotlib import pyplot as plt +import numpy as np +from matplotlib.legend_handler import HandlerLineCollection +import matplotlib.collections as mcol +from matplotlib.lines import Line2D + + +class HandlerDashedLines(HandlerLineCollection): + """ + Custom Handler for LineCollection instances. + """ + def create_artists(self, legend, orig_handle, + xdescent, ydescent, width, height, fontsize, trans): + # figure out how many lines there are + numlines = len(orig_handle.get_segments()) + xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent, + width, height, fontsize) + leglines = [] + # divide the vertical space where the lines will go + # into equal parts based on the number of lines + ydata = ((height) / (numlines + 1)) * np.ones(xdata.shape, float) + # for each line, create the line at the proper location + # and set the dash pattern + for i in range(numlines): + legline = Line2D(xdata, ydata * (numlines - i) - ydescent) + self.update_prop(legline, orig_handle, legend) + # set color, dash pattern, and linewidth to that + # of the lines in linecollection + try: + color = orig_handle.get_colors()[i] + except IndexError: + color = orig_handle.get_colors()[0] + try: + dashes = orig_handle.get_dashes()[i] + except IndexError: + dashes = orig_handle.get_dashes()[0] + try: + lw = orig_handle.get_linewidths()[i] + except IndexError: + lw = orig_handle.get_linewidths()[0] + if dashes[0] != None: + legline.set_dashes(dashes[1]) + legline.set_color(color) + legline.set_transform(trans) + legline.set_linewidth(lw) + leglines.append(legline) + return leglines + +x = np.linspace(0, 5, 100) + +plt.figure() +colors = ['red', 'orange', 'yellow', 'green', 'blue'] +styles = ['solid', 'dashed', 'dashed', 'dashed', 'solid'] +lines = [] +for i, color, style in zip(range(5), colors, styles): + plt.plot(x, np.sin(x) - .1 * i, c=color, ls=style) + + +# make proxy artists +# make list of one line -- doesn't matter what the coordinates are +line = [[(0, 0)]] +# set up the proxy artist +lc = mcol.LineCollection(5 * line, linestyles=styles, colors=colors) +# create the legend +plt.legend([lc], ['multi-line'], handler_map={type(lc): HandlerDashedLines()}, + handlelength=2.5, handleheight=3) + +plt.show()