From 62fe186abb76f9987cdaf0389cec7a502672ccd0 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Tue, 15 Jul 2014 17:17:39 +0200 Subject: [PATCH 01/16] Allow both linestyle definition "accents" and dash-patterns as linestyle for collection, lines and patches. (code & tests) --- lib/matplotlib/cbook.py | 2 +- lib/matplotlib/collections.py | 8 +- lib/matplotlib/lines.py | 13 +- lib/matplotlib/patches.py | 2 + .../test_lines/line_dashes.pdf | Bin 0 -> 1674 bytes .../test_lines/line_dashes.png | Bin 0 -> 18695 bytes .../test_lines/line_dashes.svg | 335 ++++++++++++++++++ lib/matplotlib/tests/test_collections.py | 16 +- lib/matplotlib/tests/test_lines.py | 20 ++ lib/matplotlib/tests/test_patches.py | 32 +- 10 files changed, 416 insertions(+), 12 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_lines/line_dashes.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_lines/line_dashes.png create mode 100644 lib/matplotlib/tests/baseline_images/test_lines/line_dashes.svg diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 538e0d19d207..9a27d83184bd 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -2108,7 +2108,7 @@ def unmasked_index_ranges(mask, compressed=True): (':', 'dotted')] ls_mapper = dict(_linestyles) -ls_mapper.update([(ls[1], ls[0]) for ls in _linestyles]) +ls_mapperr = dict([(ls[1], ls[0]) for ls in _linestyles]) def align_iterators(func, *iterables): diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 506583404d9e..85b462e064fe 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -469,10 +469,9 @@ def set_linestyle(self, ls): try: dashd = backend_bases.GraphicsContextBase.dashd if cbook.is_string_like(ls): + ls = cbook.ls_mapper.get(ls, ls) if ls in dashd: dashes = [dashd[ls]] - elif ls in cbook.ls_mapper: - dashes = [dashd[cbook.ls_mapper[ls]]] else: raise ValueError() elif cbook.iterable(ls): @@ -480,10 +479,9 @@ def set_linestyle(self, ls): dashes = [] for x in ls: if cbook.is_string_like(x): + x = cbook.ls_mapper.get(x, x) if x in dashd: dashes.append(dashd[x]) - elif x in cbook.ls_mapper: - dashes.append(dashd[cbook.ls_mapper[x]]) else: raise ValueError() elif cbook.iterable(x) and len(x) == 2: @@ -492,7 +490,7 @@ def set_linestyle(self, ls): raise ValueError() except ValueError: if len(ls) == 2: - dashes = ls + dashes = [ls] else: raise ValueError() else: diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 09fc968b04d1..0e75a7188292 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -16,7 +16,7 @@ from matplotlib import verbose from . import artist from .artist import Artist -from .cbook import iterable, is_string_like, is_numlike, ls_mapper +from .cbook import iterable, is_string_like, is_numlike, ls_mapperr from .colors import colorConverter from .path import Path from .transforms import Bbox, TransformedPath, IdentityTransform @@ -946,6 +946,13 @@ def set_linestyle(self, linestyle): and any drawstyle in combination with a linestyle, e.g., ``'steps--'``. """ + if not is_string_like(linestyle): + if len(linestyle) != 2: + raise ValueError() + + self.set_dashes(linestyle[1]) + self._linestyle = "--" + return for ds in self.drawStyleKeys: # long names are first in the list if linestyle.startswith(ds): @@ -957,8 +964,8 @@ def set_linestyle(self, linestyle): break if linestyle not in self._lineStyles: - if linestyle in ls_mapper: - linestyle = ls_mapper[linestyle] + if linestyle in ls_mapperr: + linestyle = ls_mapperr[linestyle] else: verbose.report('Unrecognized line style %s, %s' % (linestyle, type(linestyle))) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 339f111c2a2f..ac31a00cf2d5 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -343,6 +343,8 @@ def set_linestyle(self, ls): """ if ls is None: ls = "solid" + + ls = cbook.ls_mapper.get(ls, ls) self._linestyle = ls def set_ls(self, ls): diff --git a/lib/matplotlib/tests/baseline_images/test_lines/line_dashes.pdf b/lib/matplotlib/tests/baseline_images/test_lines/line_dashes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca440b3adecb0e91f4666931a840c03fd6243e7d GIT binary patch literal 1674 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index e4e709ffc0f0..7ae4d9a1cfec 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -323,6 +323,18 @@ def test__EventCollection__set_linestyle(): splt.set_title('EventCollection: set_linestyle') +@image_comparison(baseline_images=['EventCollection_plot__set_linestyle']) +def test__EventCollection__set_linestyle_single_dash(): + ''' + check to make sure set_linestyle accepts a single dash pattern + ''' + splt, coll, _ = generate_EventCollection_plot() + new_linestyle = (0, (6., 6.)) + coll.set_linestyle(new_linestyle) + assert_equal(coll.get_linestyle(), [(0, (6.0, 6.0))]) + splt.set_title('EventCollection: set_linestyle') + + @image_comparison(baseline_images=['EventCollection_plot__set_linewidth']) def test__EventCollection__set_linewidth(): ''' @@ -496,7 +508,7 @@ def test_polycollection_close(): vertsQuad * len(zpos), linewidth=0.25) poly.set_alpha(0.7) - ## need to have a z-value for *each* polygon = element! + # need to have a z-value for *each* polygon = element! zs = [] cs = [] for z, c in zip(zpos, colors): @@ -507,7 +519,7 @@ def test_polycollection_close(): ax.add_collection3d(poly, zs=zs, zdir='y') - ## axis limit settings: + # axis limit settings: ax.set_xlim3d(0, 4) ax.set_zlim3d(0, 3) ax.set_ylim3d(0, 4) diff --git a/lib/matplotlib/tests/test_lines.py b/lib/matplotlib/tests/test_lines.py index 55aa360af737..80cc260935ad 100644 --- a/lib/matplotlib/tests/test_lines.py +++ b/lib/matplotlib/tests/test_lines.py @@ -71,6 +71,14 @@ def test_set_line_coll_dash(): assert True +@image_comparison(baseline_images=['line_dashes'], remove_text=True) +def test_line_dashes(): + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + + ax.plot(range(10), linestyle=(0, (3, 3)), lw=5) + + @cleanup def test_line_colors(): fig = plt.figure() @@ -84,6 +92,18 @@ def test_line_colors(): assert True +@cleanup +def test_linestyle_accents(): + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + for ls in ["-", "solid", "--", "dashed", + "-.", "dashdot", ":", "dotted"]: + ax.plot(range(10), linestyle=ls) + + fig.canvas.draw() + assert True + + @image_comparison(baseline_images=['line_collection_dashes'], remove_text=True) def test_set_line_coll_dash_image(): fig = plt.figure() diff --git a/lib/matplotlib/tests/test_patches.py b/lib/matplotlib/tests/test_patches.py index 1c8549d29255..44856642b282 100644 --- a/lib/matplotlib/tests/test_patches.py +++ b/lib/matplotlib/tests/test_patches.py @@ -13,7 +13,7 @@ from matplotlib.patches import Polygon from matplotlib.patches import Rectangle -from matplotlib.testing.decorators import image_comparison +from matplotlib.testing.decorators import image_comparison, cleanup import matplotlib.pyplot as plt import matplotlib.patches as mpatches import matplotlib.collections as mcollections @@ -203,6 +203,36 @@ def test_patch_custom_linestyle(): ax.set_ylim([-1, 2]) +@cleanup +def test_patch_linestyle_accents(): + #: Test if linestyle can also be specified with short menoics + #: like "--" + #: c.f. Gihub issue #2136 + star = mpath.Path.unit_regular_star(6) + circle = mpath.Path.unit_circle() + # concatenate the star with an internal cutout of the circle + verts = np.concatenate([circle.vertices, star.vertices[::-1]]) + codes = np.concatenate([circle.codes, star.codes]) + + linestyles = ["-", "--", "-.", ":", + "solid", "dashed", "dashdot", "dotted"] + + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + for i, ls in enumerate(linestyles): + star = mpath.Path(verts + i, codes) + patch = mpatches.PathPatch(star, + linewidth=3, linestyle=ls, + facecolor=(1, 0, 0), + edgecolor=(0, 0, 1)) + ax.add_patch(patch) + + ax.set_xlim([-1, i + 1]) + ax.set_ylim([-1, i + 1]) + fig.canvas.draw() + assert True + + def test_wedge_movement(): param_dict = {'center': ((0, 0), (1, 1), 'set_center'), 'r': (5, 8, 'set_radius'), From 48063af6982e82a2e6cb2c89f1ddc17cbe9985a5 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Tue, 15 Jul 2014 21:52:30 +0200 Subject: [PATCH 02/16] refactored linestyle handling for lines Problem: cyclic import of backend_bases --- lib/matplotlib/axes/_base.py | 28 +++++-------- lib/matplotlib/cbook.py | 1 - lib/matplotlib/lines.py | 78 +++++++++++++----------------------- 3 files changed, 39 insertions(+), 68 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 91dfc0478ae4..afa90207bc98 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -80,27 +80,21 @@ def _process_plot_format(fmt): except ValueError: pass # No, not just a color. - # handle the multi char special cases and strip them from the - # string - if fmt.find('--') >= 0: - linestyle = '--' - fmt = fmt.replace('--', '') - if fmt.find('-.') >= 0: - linestyle = '-.' - fmt = fmt.replace('-.', '') - if fmt.find(' ') >= 0: - linestyle = 'None' - fmt = fmt.replace(' ', '') + for ls in sorted(mlines.lineStyles, key=len): + if fmt.find(ls) >= 0: + linestyle = ls + fmt = fmt.replace(ls, '') + break chars = [c for c in fmt] for c in chars: - if c in mlines.lineStyles: - if linestyle is not None: - raise ValueError( - 'Illegal format string "%s"; two linestyle symbols' % fmt) - linestyle = c - elif c in mlines.lineMarkers: + # if c in mlines.lineStyles: + # if linestyle is not None: + # raise ValueError( + # 'Illegal format string "%s"; two linestyle symbols' % fmt) + # linestyle = c + if c in mlines.lineMarkers: if marker is not None: raise ValueError( 'Illegal format string "%s"; two marker symbols' % fmt) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 9a27d83184bd..b6bfa4afb3c9 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -2108,7 +2108,6 @@ def unmasked_index_ranges(mask, compressed=True): (':', 'dotted')] ls_mapper = dict(_linestyles) -ls_mapperr = dict([(ls[1], ls[0]) for ls in _linestyles]) def align_iterators(func, *iterables): diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 0e75a7188292..f7e10a566efd 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -16,7 +16,7 @@ from matplotlib import verbose from . import artist from .artist import Artist -from .cbook import iterable, is_string_like, is_numlike, ls_mapperr +from .cbook import iterable, is_string_like, is_numlike, ls_mapper from .colors import colorConverter from .path import Path from .transforms import Bbox, TransformedPath, IdentityTransform @@ -25,6 +25,8 @@ from .artist import allow_rasterization from matplotlib import docstring from matplotlib.markers import MarkerStyle +import matplotlib.backend_bases + # Imported here for backward compatibility, even though they don't # really belong. from matplotlib.markers import TICKLEFT, TICKRIGHT, TICKUP, TICKDOWN @@ -194,15 +196,9 @@ class Line2D(Artist): """ - lineStyles = _lineStyles = { # hidden names deprecated - '-': '_draw_solid', - '--': '_draw_dashed', - '-.': '_draw_dash_dot', - ':': '_draw_dotted', - 'None': '_draw_nothing', - ' ': '_draw_nothing', - '': '_draw_nothing', - } + lineStyles = _lineStyles = [ # hidden names deprecated + '-', '--', '-.', ':' # , 'None', ' ', #'' + ] _drawStyles_l = { 'default': '_draw_lines', @@ -328,7 +324,6 @@ def __init__(self, xdata, ydata, self.set_markevery(markevery) self.set_antialiased(antialiased) self.set_markersize(markersize) - self._dashSeq = None self.set_markerfacecolor(markerfacecolor) self.set_markerfacecoloralt(markerfacecoloralt) @@ -702,11 +697,10 @@ def draw(self, renderer): if self.get_sketch_params() is not None: gc.set_sketch_params(*self.get_sketch_params()) - funcname = self._lineStyles.get(self._linestyle, '_draw_nothing') - if funcname != '_draw_nothing': + linestyle = self._linestyle + if linestyle: tpath, affine = transf_path.get_transformed_path_and_affine() if len(tpath.vertices): - self._lineFunc = getattr(self, funcname) funcname = self.drawStyles.get(self._drawstyle, '_draw_lines') drawFunc = getattr(self, funcname) drawFunc(renderer, gc, tpath, affine.frozen()) @@ -950,8 +944,7 @@ def set_linestyle(self, linestyle): if len(linestyle) != 2: raise ValueError() - self.set_dashes(linestyle[1]) - self._linestyle = "--" + self._linestyle = linestyle return for ds in self.drawStyleKeys: # long names are first in the list @@ -963,14 +956,19 @@ def set_linestyle(self, linestyle): linestyle = '-' break - if linestyle not in self._lineStyles: - if linestyle in ls_mapperr: - linestyle = ls_mapperr[linestyle] - else: + linestyle = ls_mapper.get(linestyle, linestyle) + # TODO: check if in dashd of backend? + #else: + # verbose.report('Unrecognized line style %s, %s' % + # (linestyle, type(linestyle))) + if linestyle in [' ', 'None', 'none', '']: + linestyle = '' + else: + dashd = matplotlib.backend_bases.GraphicsContextBase.dashd + if linestyle not in dashd: verbose.report('Unrecognized line style %s, %s' % (linestyle, type(linestyle))) - if linestyle in [' ', '']: - linestyle = 'None' + linestyle = '' self._linestyle = linestyle @docstring.dedent_interpd @@ -1067,11 +1065,11 @@ def set_dashes(self, seq): if seq == (None, None) or len(seq) == 0: self.set_linestyle('-') else: - self.set_linestyle('--') - self._dashSeq = seq # TODO: offset ignored for now + self._linestyle = (0, seq) # TODO: offset ignored for now def _draw_lines(self, renderer, gc, path, trans): - self._lineFunc(renderer, gc, path, trans) + gc.set_linestyle(self._linestyle) + renderer.draw_path(gc, path, trans) def _draw_steps_pre(self, renderer, gc, path, trans): vertices = self._xy @@ -1082,7 +1080,7 @@ def _draw_steps_pre(self, renderer, gc, path, trans): path = Path(steps) path = path.transformed(self.get_transform()) - self._lineFunc(renderer, gc, path, IdentityTransform()) + self._draw_lines(renderer, gc, path, IdentityTransform()) def _draw_steps_post(self, renderer, gc, path, trans): vertices = self._xy @@ -1093,7 +1091,7 @@ def _draw_steps_post(self, renderer, gc, path, trans): path = Path(steps) path = path.transformed(self.get_transform()) - self._lineFunc(renderer, gc, path, IdentityTransform()) + self._draw_lines(renderer, gc, path, IdentityTransform()) def _draw_steps_mid(self, renderer, gc, path, trans): vertices = self._xy @@ -1107,26 +1105,7 @@ def _draw_steps_mid(self, renderer, gc, path, trans): path = Path(steps) path = path.transformed(self.get_transform()) - self._lineFunc(renderer, gc, path, IdentityTransform()) - - def _draw_solid(self, renderer, gc, path, trans): - gc.set_linestyle('solid') - renderer.draw_path(gc, path, trans) - - def _draw_dashed(self, renderer, gc, path, trans): - gc.set_linestyle('dashed') - if self._dashSeq is not None: - gc.set_dashes(0, self._dashSeq) - - renderer.draw_path(gc, path, trans) - - def _draw_dash_dot(self, renderer, gc, path, trans): - gc.set_linestyle('dashdot') - renderer.draw_path(gc, path, trans) - - def _draw_dotted(self, renderer, gc, path, trans): - gc.set_linestyle('dotted') - renderer.draw_path(gc, path, trans) + self._draw_lines(renderer, gc, path, IdentityTransform()) def update_from(self, other): """copy properties from other to self""" @@ -1139,13 +1118,11 @@ def update_from(self, other): self._markerfacecoloralt = other._markerfacecoloralt self._markeredgecolor = other._markeredgecolor self._markeredgewidth = other._markeredgewidth - self._dashSeq = other._dashSeq self._dashcapstyle = other._dashcapstyle self._dashjoinstyle = other._dashjoinstyle self._solidcapstyle = other._solidcapstyle self._solidjoinstyle = other._solidjoinstyle - self._linestyle = other._linestyle self._marker = MarkerStyle(other._marker.get_marker(), other._marker.get_fillstyle()) self._drawstyle = other._drawstyle @@ -1316,7 +1293,8 @@ def get_solid_capstyle(self): def is_dashed(self): 'return True if line is dashstyle' - return self._linestyle in ('--', '-.', ':') + return self._linestyle in ('dashed', 'dashdot', 'dotted') or \ + not is_string_like(self._linestyle) class VertexSelector(object): From 14fa552062feac17d0ec34fd0204fd0a8a91b9b7 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Tue, 29 Jul 2014 09:40:15 +0200 Subject: [PATCH 03/16] Check for double linestyle definition in plot_format changed collision detection in lines.py to use ``not linestyle`` --- lib/matplotlib/axes/_base.py | 12 +++++++----- lib/matplotlib/lines.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index afa90207bc98..34dfcaf03c2c 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -86,14 +86,16 @@ def _process_plot_format(fmt): fmt = fmt.replace(ls, '') break + # Check for double linestyle definition + if linestyle: + for ls in sorted(mlines.lineStyles, key=len): + if fmt.find(ls) >= 0: + raise ValueError( + 'Illegal format string "%s"; two linestyle symbols' % fmt) + chars = [c for c in fmt] for c in chars: - # if c in mlines.lineStyles: - # if linestyle is not None: - # raise ValueError( - # 'Illegal format string "%s"; two linestyle symbols' % fmt) - # linestyle = c if c in mlines.lineMarkers: if marker is not None: raise ValueError( diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index f7e10a566efd..2c621cfd92a0 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -403,7 +403,7 @@ def contains(self, mouseevent): olderrflags = np.seterr(all='ignore') try: # Check for collision - if self._linestyle in ['None', None]: + if not self._linestyle: # If no line, return the nearby point(s) d = (xt - mouseevent.x) ** 2 + (yt - mouseevent.y) ** 2 ind, = np.nonzero(np.less_equal(d, pixels ** 2)) From e5211f1cbb34a28aaa97af30f87990f3a14b3542 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Tue, 29 Jul 2014 09:42:33 +0200 Subject: [PATCH 04/16] Added documentation changes for #2136 --- lib/matplotlib/collections.py | 3 ++- lib/matplotlib/lines.py | 30 +++++++++++++++--------------- lib/matplotlib/patches.py | 4 +++- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 85b462e064fe..9b6793762364 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -463,7 +463,8 @@ def set_linestyle(self, ls): """ Set the linestyle(s) for the collection. - ACCEPTS: ['solid' | 'dashed', 'dashdot', 'dotted' | + ACCEPTS: [ '-' | '--' | '-.' | ':' | + 'solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] """ try: diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 2c621cfd92a0..73e30b85ea38 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -915,17 +915,17 @@ def set_linestyle(self, linestyle): Set the linestyle of the line (also accepts drawstyles) - ================ ================= - linestyle description - ================ ================= - ``'-'`` solid - ``'--'`` dashed - ``'-.'`` dash_dot - ``':'`` dotted - ``'None'`` draw nothing - ``' '`` draw nothing - ``''`` draw nothing - ================ ================= + ================ ================= + linestyle description + ================ ================= + ``'-'`` or ``'solid'`` solid line + ``'--'`` or ``'dashed'`` dashed line + ``'-.'`` or ``'dash_dot'`` dash-dotted line + ``':'`` or ``'dotted'`` dotted line + ``'None'`` draw nothing + ``' '`` draw nothing + ``''`` draw nothing + ================ ================= 'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility. @@ -935,10 +935,10 @@ def set_linestyle(self, linestyle): :meth:`set_drawstyle` To set the drawing style (stepping) of the plot. - ACCEPTS: [``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | - ``' '`` | ``''``] - - and any drawstyle in combination with a linestyle, e.g., ``'steps--'``. + ACCEPTS: [``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | + ``'solid'`` | ``'dashed'`` | ``'dash_dot'`` | ``'dotted'`` | + ``'None'`` | ``' '`` | ``''``] + and any drawstyle in combination with a linestyle, e.g., ``'steps--'``. """ if not is_string_like(linestyle): if len(linestyle) != 2: diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index ac31a00cf2d5..32a41b74e09a 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -339,7 +339,9 @@ def set_linestyle(self, ls): """ Set the patch linestyle - ACCEPTS: ['solid' | 'dashed' | 'dashdot' | 'dotted'] + ACCEPTS: ['-' | '--' | '-.' | ':' | + 'solid' | 'dashed' | 'dashdot' | 'dotted' | + (offset, on-off-dash-seq) ] """ if ls is None: ls = "solid" From 209fb1c4454aa0435466ec396409b244de10bfdb Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Tue, 29 Jul 2014 09:43:22 +0200 Subject: [PATCH 05/16] Make baseline image for testing single_dash pattern in collections.py seperate image (to allow multiprocess testing...) --- lib/matplotlib/tests/test_collections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index 7ae4d9a1cfec..4735ce1c339c 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -323,7 +323,7 @@ def test__EventCollection__set_linestyle(): splt.set_title('EventCollection: set_linestyle') -@image_comparison(baseline_images=['EventCollection_plot__set_linestyle']) +@image_comparison(baseline_images=['EventCollection_plot__set_ls_dash']) def test__EventCollection__set_linestyle_single_dash(): ''' check to make sure set_linestyle accepts a single dash pattern From ac6f3b8fd30fa6ed6d775fe8b127280a083f1363 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Tue, 29 Jul 2014 10:23:46 +0200 Subject: [PATCH 06/16] Added missing baseline_images --- .../EventCollection_plot__set_ls_dash.pdf | Bin 0 -> 10515 bytes .../EventCollection_plot__set_ls_dash.png | Bin 0 -> 16631 bytes .../EventCollection_plot__set_ls_dash.svg | 697 ++++++++++++++++++ 3 files changed, 697 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_collections/EventCollection_plot__set_ls_dash.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_collections/EventCollection_plot__set_ls_dash.png create mode 100644 lib/matplotlib/tests/baseline_images/test_collections/EventCollection_plot__set_ls_dash.svg diff --git a/lib/matplotlib/tests/baseline_images/test_collections/EventCollection_plot__set_ls_dash.pdf b/lib/matplotlib/tests/baseline_images/test_collections/EventCollection_plot__set_ls_dash.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55f48e230c9b950db78f72886a0d45bdcc68c7fb GIT binary patch literal 10515 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_collections/EventCollection_plot__set_ls_dash.png b/lib/matplotlib/tests/baseline_images/test_collections/EventCollection_plot__set_ls_dash.png new file mode 100644 index 0000000000000000000000000000000000000000..e748ee7e6928b588b26485cf2975986540ce77bb GIT binary patch literal 16631 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7a6d179c90a03ffc06bdb40b90738a5c136c8bc6 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Sun, 19 Oct 2014 10:39:39 +0200 Subject: [PATCH 07/16] Corrected wrong ordering of linestyles in axes._base._process_plot_format --- lib/matplotlib/axes/_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 34dfcaf03c2c..9a045afba781 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -80,7 +80,7 @@ def _process_plot_format(fmt): except ValueError: pass # No, not just a color. - for ls in sorted(mlines.lineStyles, key=len): + for ls in sorted(mlines.lineStyles, key=len, reverse=True): if fmt.find(ls) >= 0: linestyle = ls fmt = fmt.replace(ls, '') From 8e6b78bc4ad9326811549b7c486a5d0fb5b22da8 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Sun, 19 Oct 2014 10:41:27 +0200 Subject: [PATCH 08/16] Coding style --- lib/matplotlib/lines.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 73e30b85ea38..d9e3f12de4b2 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -1293,8 +1293,8 @@ def get_solid_capstyle(self): def is_dashed(self): 'return True if line is dashstyle' - return self._linestyle in ('dashed', 'dashdot', 'dotted') or \ - not is_string_like(self._linestyle) + return (self._linestyle in ('dashed', 'dashdot', 'dotted') or + not is_string_like(self._linestyle)) class VertexSelector(object): From 1bb78d077c250ab4001fe7a2fe2eb1e6e3ed4e55 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Sun, 19 Oct 2014 12:18:14 +0200 Subject: [PATCH 09/16] Changed docstrings to numpydoc format and rst style corrections --- lib/matplotlib/collections.py | 8 +++++--- lib/matplotlib/lines.py | 16 +++++++++------- lib/matplotlib/patches.py | 7 ++++--- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 9b6793762364..6719f2dd62c2 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -463,9 +463,11 @@ def set_linestyle(self, ls): """ Set the linestyle(s) for the collection. - ACCEPTS: [ '-' | '--' | '-.' | ':' | - 'solid' | 'dashed', 'dashdot', 'dotted' | - (offset, on-off-dash-seq) ] + + Parameters + ---------- + ls : { '-', '--', '-.', ':' , 'solid', 'dashed', 'dashdot', 'dotted', (offset, on-off-dash-seq)} + The line style. [[EXPLAIN on-off-dash-seq]] """ try: dashd = backend_bases.GraphicsContextBase.dashd diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index d9e3f12de4b2..7999dc625ca2 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -915,9 +915,9 @@ def set_linestyle(self, linestyle): Set the linestyle of the line (also accepts drawstyles) - ================ ================= + =========================== ================= linestyle description - ================ ================= + =========================== ================= ``'-'`` or ``'solid'`` solid line ``'--'`` or ``'dashed'`` dashed line ``'-.'`` or ``'dash_dot'`` dash-dotted line @@ -925,7 +925,7 @@ def set_linestyle(self, linestyle): ``'None'`` draw nothing ``' '`` draw nothing ``''`` draw nothing - ================ ================= + =========================== ================= 'steps' is equivalent to 'steps-pre' and is maintained for backward-compatibility. @@ -935,10 +935,12 @@ def set_linestyle(self, linestyle): :meth:`set_drawstyle` To set the drawing style (stepping) of the plot. - ACCEPTS: [``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | - ``'solid'`` | ``'dashed'`` | ``'dash_dot'`` | ``'dotted'`` | - ``'None'`` | ``' '`` | ``''``] - and any drawstyle in combination with a linestyle, e.g., ``'steps--'``. + Parameters + ---------- + ls : { '-', '--', '-.', ':' , 'solid', 'dashed', 'dashdot', 'dotted', (offset, on-off-dash-seq)} + The line style. [[EXPLAIN on-off-dash-seq]] + Also accepts any drawstyle in combination with a linestyle, + e.g., ``'steps--'``. """ if not is_string_like(linestyle): if len(linestyle) != 2: diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 32a41b74e09a..ce9247a391ad 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -339,9 +339,10 @@ def set_linestyle(self, ls): """ Set the patch linestyle - ACCEPTS: ['-' | '--' | '-.' | ':' | - 'solid' | 'dashed' | 'dashdot' | 'dotted' | - (offset, on-off-dash-seq) ] + Parameters + ---------- + ls : { '-', '--', '-.', ':' , 'solid', 'dashed', 'dashdot', 'dotted', (offset, on-off-dash-seq)} + The line style. [[EXPLAIN on-off-dash-seq]] """ if ls is None: ls = "solid" From 1dc8d8990d4e1e805a620ef660794d6829828f64 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 19 Oct 2014 13:06:39 -0400 Subject: [PATCH 10/16] TST : skeletal test for parsing plot format string This needs to be fleshed out to cover more valid inputs --- lib/matplotlib/__init__.py | 1 + lib/matplotlib/tests/test_fmt.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 lib/matplotlib/tests/test_fmt.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 456b86ff4eae..51eaf0da3dff 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -1446,6 +1446,7 @@ def tk_window_focus(): 'matplotlib.tests.test_transforms', 'matplotlib.tests.test_triangulation', 'mpl_toolkits.tests.test_mplot3d', + 'matplotlib.tests.test_fmt' ] diff --git a/lib/matplotlib/tests/test_fmt.py b/lib/matplotlib/tests/test_fmt.py new file mode 100644 index 000000000000..9d27858ae2f0 --- /dev/null +++ b/lib/matplotlib/tests/test_fmt.py @@ -0,0 +1,27 @@ +from __future__ import (absolute_import, division, print_function, + unicode_literals) +from matplotlib.testing.decorators import cleanup +import six + + +from nose.tools import assert_equal + +from matplotlib.axes._axes import _process_plot_format + + +@cleanup +def _fmt_parsing_helper(fmt, ref): + assert_equal(ref, _process_plot_format(fmt)) + + +def test_fmt_parsing(): + test_cases = (('-', ('-', 'None', None)), + ('--', ('--', 'None', None)), + ('-g', ('-', 'None', 'g')), + ('-og', ('-', 'o', 'g')), + ('-or', ('-', 'o', 'r')), + ('-ok', ('-', 'o', 'k')) + ) + + for fmt, target in test_cases: + yield _fmt_parsing_helper, fmt, target From d1ac2228a8281f00108af19dc8deae7fc65f84f1 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 19 Oct 2014 13:13:31 -0400 Subject: [PATCH 11/16] TST : added test to make sure bad fmts fail Needs more test cases. This obviously can't cover every case that fails. --- lib/matplotlib/tests/test_fmt.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_fmt.py b/lib/matplotlib/tests/test_fmt.py index 9d27858ae2f0..24ee738e5fdc 100644 --- a/lib/matplotlib/tests/test_fmt.py +++ b/lib/matplotlib/tests/test_fmt.py @@ -4,7 +4,7 @@ import six -from nose.tools import assert_equal +from nose.tools import assert_equal, assert_raises from matplotlib.axes._axes import _process_plot_format @@ -14,6 +14,11 @@ def _fmt_parsing_helper(fmt, ref): assert_equal(ref, _process_plot_format(fmt)) +@cleanup +def _fmt_parsing_invalid_helper(fmt): + assert_raises(ValueError, _process_plot_format, fmt) + + def test_fmt_parsing(): test_cases = (('-', ('-', 'None', None)), ('--', ('--', 'None', None)), @@ -25,3 +30,10 @@ def test_fmt_parsing(): for fmt, target in test_cases: yield _fmt_parsing_helper, fmt, target + + +def test_fmt_parsing_fail(): + test_strings = ('bb-', + 'xog') + for fmt in test_strings: + yield _fmt_parsing_invalid_helper, fmt From c53dbe08e5bef1cab0de126ea09144cf8f80f8a2 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Mon, 20 Oct 2014 20:00:36 +0200 Subject: [PATCH 12/16] Removed converting color and setting linestyle in _process_plot_format Added tests to test_fmt for _process_plot_format --- lib/matplotlib/axes/_base.py | 10 ++----- lib/matplotlib/tests/test_fmt.py | 51 +++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 9a045afba781..e6baadf06f2d 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -63,7 +63,8 @@ def _process_plot_format(fmt): # Is fmt just a colorspec? try: - color = mcolors.colorConverter.to_rgb(fmt) + mcolors.colorConverter.to_rgb(fmt) + color = fmt # We need to differentiate grayscale '1.0' from tri_down marker '1' try: @@ -110,13 +111,6 @@ def _process_plot_format(fmt): raise ValueError( 'Unrecognized character %c in format string' % c) - if linestyle is None and marker is None: - linestyle = rcParams['lines.linestyle'] - if linestyle is None: - linestyle = 'None' - if marker is None: - marker = 'None' - return linestyle, marker, color diff --git a/lib/matplotlib/tests/test_fmt.py b/lib/matplotlib/tests/test_fmt.py index 24ee738e5fdc..dde25c35edd2 100644 --- a/lib/matplotlib/tests/test_fmt.py +++ b/lib/matplotlib/tests/test_fmt.py @@ -20,12 +20,42 @@ def _fmt_parsing_invalid_helper(fmt): def test_fmt_parsing(): - test_cases = (('-', ('-', 'None', None)), - ('--', ('--', 'None', None)), - ('-g', ('-', 'None', 'g')), - ('-og', ('-', 'o', 'g')), - ('-or', ('-', 'o', 'r')), - ('-ok', ('-', 'o', 'k')) + test_cases = (('-', ('-', None, None)), + ('--', ('--', None, None)), + ('-.', ('-.', None, None)), + (':', (':', None, None)), + ('-g', ('-', None, 'g')), + ('--r', ('--', None, 'r')), + ('-.k', ('-.', None, 'k')), + (':b', (':', None, 'b')), + ('-o', ('-', 'o', None)), + ('--,', ('--', ',', None)), + ('-..', ('-.', '.', None)), + ('v:', (':', 'v', None)), + ('-g^', ('-', '^', 'g')), + ('--r<', ('--', '<', 'r')), + (':>g', (':', '>', 'g')), + ('.-.k', ('-.', '.', 'k')), + ('-c', ('-', None, 'c')), + ('-1m', ('-', '1', 'm')), + ('-y2', ('-', '2', 'y')), + ('w-3', ('-', '3', 'w')), + ('--.', ('--', '.', None)), + ('-4k', ('-', '4', 'k')), + ('sk', (None, 's', 'k')), + ('r', (None, None, 'r')), + ('1.0', (None, None, '1.0')), + ('0.8', (None, None, '0.8')), + ('p', (None, 'p', None)), + ('*--', ('--', '*', None)), + ('kh:', (':', 'h', 'k')), + ('H-r', ('-', 'H', 'r')), + ('--+g', ('--', '+', 'g')), + (':xb', (':', 'x', 'b')), + ('cD-.', ('-.', 'D', 'c')), + ('m--d', ('--', 'd', 'm')), + (':y|', (':', '|', 'y')), + ('w_-', ('-', '_', 'w')) ) for fmt, target in test_cases: @@ -34,6 +64,13 @@ def test_fmt_parsing(): def test_fmt_parsing_fail(): test_strings = ('bb-', - 'xog') + 'xog', + '---.', + ':-', + '12c', + '--ph', + ',u', + ',1.0', + '.0.8') for fmt in test_strings: yield _fmt_parsing_invalid_helper, fmt From 24e1301feff2e313ba2a4a72c6e8498531a933ce Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Mon, 20 Oct 2014 21:25:19 +0200 Subject: [PATCH 13/16] Restored setting linestyle or marker to 'None' if only one is given in fmt --- lib/matplotlib/axes/_base.py | 5 +++++ lib/matplotlib/tests/test_fmt.py | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index e6baadf06f2d..6daa3cc7ea3f 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -111,6 +111,11 @@ def _process_plot_format(fmt): raise ValueError( 'Unrecognized character %c in format string' % c) + if linestyle is None and marker is not None: + linestyle = 'None' + if marker is None and linestyle is not None: + marker = 'None' + return linestyle, marker, color diff --git a/lib/matplotlib/tests/test_fmt.py b/lib/matplotlib/tests/test_fmt.py index dde25c35edd2..7fc3fdb5dde9 100644 --- a/lib/matplotlib/tests/test_fmt.py +++ b/lib/matplotlib/tests/test_fmt.py @@ -20,14 +20,14 @@ def _fmt_parsing_invalid_helper(fmt): def test_fmt_parsing(): - test_cases = (('-', ('-', None, None)), - ('--', ('--', None, None)), - ('-.', ('-.', None, None)), - (':', (':', None, None)), - ('-g', ('-', None, 'g')), - ('--r', ('--', None, 'r')), - ('-.k', ('-.', None, 'k')), - (':b', (':', None, 'b')), + test_cases = (('-', ('-', 'None', None)), + ('--', ('--', 'None', None)), + ('-.', ('-.', 'None', None)), + (':', (':', 'None', None)), + ('-g', ('-', 'None', 'g')), + ('--r', ('--', 'None', 'r')), + ('-.k', ('-.', 'None', 'k')), + (':b', (':', 'None', 'b')), ('-o', ('-', 'o', None)), ('--,', ('--', ',', None)), ('-..', ('-.', '.', None)), @@ -36,17 +36,17 @@ def test_fmt_parsing(): ('--r<', ('--', '<', 'r')), (':>g', (':', '>', 'g')), ('.-.k', ('-.', '.', 'k')), - ('-c', ('-', None, 'c')), + ('-c', ('-', 'None', 'c')), ('-1m', ('-', '1', 'm')), ('-y2', ('-', '2', 'y')), ('w-3', ('-', '3', 'w')), ('--.', ('--', '.', None)), ('-4k', ('-', '4', 'k')), - ('sk', (None, 's', 'k')), + ('sk', ('None', 's', 'k')), ('r', (None, None, 'r')), ('1.0', (None, None, '1.0')), ('0.8', (None, None, '0.8')), - ('p', (None, 'p', None)), + ('p', ('None', 'p', None)), ('*--', ('--', '*', None)), ('kh:', (':', 'h', 'k')), ('H-r', ('-', 'H', 'r')), From bea26348596ee1d6b366050235dc5904260d5b27 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Fri, 24 Oct 2014 14:07:02 +0200 Subject: [PATCH 14/16] Extended docstring of set_linestyle and shortend type description to make travis happy --- lib/matplotlib/collections.py | 13 +++++++++++-- lib/matplotlib/lines.py | 15 +++++++++++---- lib/matplotlib/patches.py | 13 +++++++++++-- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 6719f2dd62c2..ccb41c776a0f 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -466,8 +466,17 @@ def set_linestyle(self, ls): Parameters ---------- - ls : { '-', '--', '-.', ':' , 'solid', 'dashed', 'dashdot', 'dotted', (offset, on-off-dash-seq)} - The line style. [[EXPLAIN on-off-dash-seq]] + ls : { '-', '--', '-.', ':'} and more see description + The line style. The written out linestyles + 'solid', 'dashed', 'dashdot' and 'dotted' and drawstyle in + combination with a linestyle, e.g., ``'steps--'`` are also allowed. + + Alternatively a dash tuple of the following form can be provided:: + + (offset, onoffseq), + + where ``onoffseq`` is an even length tuple of on and off ink + in points. """ try: dashd = backend_bases.GraphicsContextBase.dashd diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 7999dc625ca2..6d002d30f002 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -937,10 +937,17 @@ def set_linestyle(self, linestyle): Parameters ---------- - ls : { '-', '--', '-.', ':' , 'solid', 'dashed', 'dashdot', 'dotted', (offset, on-off-dash-seq)} - The line style. [[EXPLAIN on-off-dash-seq]] - Also accepts any drawstyle in combination with a linestyle, - e.g., ``'steps--'``. + ls : { '-', '--', '-.', ':'} and more see description + The line style. The written out linestyles + 'solid', 'dashed', 'dashdot' and 'dotted' and drawstyle in + combination with a linestyle, e.g., ``'steps--'`` are also allowed. + + Alternatively a dash tuple of the following form can be provided:: + + (offset, onoffseq), + + where ``onoffseq`` is an even length tuple of on and off ink + in points. """ if not is_string_like(linestyle): if len(linestyle) != 2: diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index ce9247a391ad..7f48183f2a57 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -341,8 +341,17 @@ def set_linestyle(self, ls): Parameters ---------- - ls : { '-', '--', '-.', ':' , 'solid', 'dashed', 'dashdot', 'dotted', (offset, on-off-dash-seq)} - The line style. [[EXPLAIN on-off-dash-seq]] + ls : { '-', '--', '-.', ':'} and more see description + The line style. The written out linestyles + 'solid', 'dashed', 'dashdot' and 'dotted' and drawstyle in + combination with a linestyle, e.g., ``'steps--'`` are also allowed. + + Alternatively a dash tuple of the following form can be provided:: + + (offset, onoffseq), + + where ``onoffseq`` is an even length tuple of on and off ink + in points. """ if ls is None: ls = "solid" From 23d5e56bda7fbad314ad12dc12953a6469d2b826 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Fri, 24 Oct 2014 14:07:31 +0200 Subject: [PATCH 15/16] Fixed triplot to deal with linestyle or marker being None --- lib/matplotlib/tests/test_triangulation.py | 2 +- lib/matplotlib/tri/triplot.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/test_triangulation.py b/lib/matplotlib/tests/test_triangulation.py index 87719c29a63d..3b26f0789f35 100644 --- a/lib/matplotlib/tests/test_triangulation.py +++ b/lib/matplotlib/tests/test_triangulation.py @@ -765,7 +765,7 @@ def z(x, y): refiner = mtri.UniformTriRefiner(triang0) tri_refi, z_test_refi = refiner.refine_field(z0, subdiv=4) levels = np.arange(0., 1., 0.025) - plt.triplot(triang0, lw=0.5, color='0.5') + plt.triplot(triang0, '0.5', lw=0.5) plt.tricontour(tri_refi, z_test_refi, levels=levels, colors="black") diff --git a/lib/matplotlib/tri/triplot.py b/lib/matplotlib/tri/triplot.py index fe0a064d8a71..6d2f05d24021 100644 --- a/lib/matplotlib/tri/triplot.py +++ b/lib/matplotlib/tri/triplot.py @@ -5,7 +5,7 @@ import numpy as np from matplotlib.tri.triangulation import Triangulation - +import matplotlib def triplot(ax, *args, **kwargs): """ @@ -54,6 +54,10 @@ def triplot(ax, *args, **kwargs): if len(args) > 0: fmt = args[0] linestyle, marker, color = matplotlib.axes._base._process_plot_format(fmt) + if linestyle is None: + linestyle = matplotlib.rcParams['lines.linestyle'] + if marker is None: + marker = matplotlib.rcParams['lines.marker'] # Insert plot format string into a copy of kwargs (kwargs values prevail). kw = kwargs.copy() From 03b897f4e9ee97a0de6a4f00481d497ff85e14f5 Mon Sep 17 00:00:00 2001 From: Lennart Fricke Date: Fri, 24 Oct 2014 14:18:57 +0200 Subject: [PATCH 16/16] Coding style --- lib/matplotlib/tri/triplot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/tri/triplot.py b/lib/matplotlib/tri/triplot.py index 6d2f05d24021..d0bdc0e6fb01 100644 --- a/lib/matplotlib/tri/triplot.py +++ b/lib/matplotlib/tri/triplot.py @@ -7,6 +7,7 @@ from matplotlib.tri.triangulation import Triangulation import matplotlib + def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers.