From 914385ae9617016acb38d1ff049f4b640ed93b10 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sat, 7 Apr 2012 19:32:50 -0400 Subject: [PATCH 01/13] Added new plot style: stackplot. Stackplot adds the feature request in issue #359 (https://github.com/matplotlib/matplotlib/issues/359) and borrows heavily from Doug Y'barbo's stackoverflow answer (http://stackoverflow.com/questions/2225995/how-can-i-create-stacked-line-graph-with-matplotlib). --- lib/matplotlib/axes.py | 5 +++++ lib/matplotlib/stackplot.py | 42 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 lib/matplotlib/stackplot.py diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index d2dec622cd80..38add87b7a1c 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -29,6 +29,7 @@ import matplotlib.spines as mspines import matplotlib.quiver as mquiver import matplotlib.scale as mscale +import matplotlib.stackplot as mstack import matplotlib.streamplot as mstream import matplotlib.table as mtable import matplotlib.text as mtext @@ -6408,6 +6409,10 @@ def quiver(self, *args, **kw): return q quiver.__doc__ = mquiver.Quiver.quiver_doc + def stackplot(self, x, y): + return mstack.stackplot(self, x, y) + stackplot.__doc__ = mstack.stackplot.__doc__ + def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', minlength=0.1): diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py new file mode 100644 index 000000000000..8ba83390e371 --- /dev/null +++ b/lib/matplotlib/stackplot.py @@ -0,0 +1,42 @@ +""" +Stacked area plot for 1D arrays inspired by Douglas Y'barbo's stackoverflow +answer: +http://stackoverflow.com/questions/2225995/how-can-i-create-stacked-line-graph-with-matplotlib + +(http://stackoverflow.com/users/66549/doug) + +""" +import numpy as np +import matplotlib + +__all__ = ['stackplot'] + + +def stackplot(axes, x, y): + """Draws a stacked area plot. + + Parameters + ---------- + *x* : 1d array of dimension N + *y* : 2d array of dimension MxN + + Returns + ------- + *r* : A list of `matplotlib.collections.PolyCollection`, one for each + element in the stacked area plot. + """ + + y = np.atleast_2d(y) + + # Assume data passed has not been 'stacked', so stack it here. + y_stack = np.cumsum(y, axis=0) + + r = [] + + # Color between x = 0 and the first array. + r.append(axes.fill_between(x, 0, y_stack[0,:], facecolor=axes._get_lines.color_cycle.next())) + + # Color between array i-1 and array i + for i in xrange(len(y)-1): + r.append(axes.fill_between(x, y_stack[i-1,:], y_stack[i,:], facecolor=axes._get_lines.color_cycle.next())) + return r From 45575731c75db755d6d273d64376be4efdad4f5e Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sat, 7 Apr 2012 19:35:10 -0400 Subject: [PATCH 02/13] Added stackplot example. --- examples/pylab_examples/stackplot_demo.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 examples/pylab_examples/stackplot_demo.py diff --git a/examples/pylab_examples/stackplot_demo.py b/examples/pylab_examples/stackplot_demo.py new file mode 100644 index 000000000000..eca1f78fa0da --- /dev/null +++ b/examples/pylab_examples/stackplot_demo.py @@ -0,0 +1,11 @@ +import numpy as np +from matplotlib import pyplot as plt + +fnx = lambda : np.random.randint(5, 50, 10) +y = np.row_stack((fnx(), fnx(), fnx())) +x = np.arange(10) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.stackplot(x, y) +plt.show() From ff8ecde37da11c6133ef6879040bfeb127f7d255 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Fri, 13 Apr 2012 23:40:54 -0400 Subject: [PATCH 03/13] Make docstring more helpful. The data *y* is assumed to be unstacked. This is now explicitly said in the docstring for the paramater *y*. --- lib/matplotlib/stackplot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py index 8ba83390e371..45310997316f 100644 --- a/lib/matplotlib/stackplot.py +++ b/lib/matplotlib/stackplot.py @@ -18,12 +18,12 @@ def stackplot(axes, x, y): Parameters ---------- *x* : 1d array of dimension N - *y* : 2d array of dimension MxN + *y* : 2d array of dimension MxN. The data is assumed to be unstacked. Returns ------- *r* : A list of `matplotlib.collections.PolyCollection`, one for each - element in the stacked area plot. + element in the stacked area plot. """ y = np.atleast_2d(y) From 8bbac65f9495f487a6644f0480acce146b4d95ac Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sat, 14 Apr 2012 00:14:23 -0400 Subject: [PATCH 04/13] Make stackplot take an arbitrary number of args. stackplot now supports taking either an MxN array of data, stacking along axis=0, or an arbitrary number of 1xN arrays, stacking them in the order passed. No checks are done for the case when no the number of args is zero. An exception should probably be raised here. Updated docstring to explain new call signatures. --- lib/matplotlib/axes.py | 4 ++-- lib/matplotlib/stackplot.py | 14 +++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 38add87b7a1c..ec5c8a21705d 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -6409,8 +6409,8 @@ def quiver(self, *args, **kw): return q quiver.__doc__ = mquiver.Quiver.quiver_doc - def stackplot(self, x, y): - return mstack.stackplot(self, x, y) + def stackplot(self, x, *args): + return mstack.stackplot(self, x, *args) stackplot.__doc__ = mstack.stackplot.__doc__ def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py index 45310997316f..14bb923c0f56 100644 --- a/lib/matplotlib/stackplot.py +++ b/lib/matplotlib/stackplot.py @@ -12,13 +12,18 @@ __all__ = ['stackplot'] -def stackplot(axes, x, y): +def stackplot(axes, x, *args): """Draws a stacked area plot. Parameters ---------- *x* : 1d array of dimension N - *y* : 2d array of dimension MxN. The data is assumed to be unstacked. + *y* : 2d array of dimension MxN, OR any number 1d arrays each of dimension + 1xN. The data is assumed to be unstacked. Each of the following + calls is legal: + + stackplot(x, y) # where y is MxN + staclplot(x, y1, y2, y3, y4) # where y1, y2, y3, y4, are all 1xN Returns ------- @@ -26,7 +31,10 @@ def stackplot(axes, x, y): element in the stacked area plot. """ - y = np.atleast_2d(y) + if len(args) == 1: + y = np.atleast_2d(*args) + elif len(args) > 1: + y = np.row_stack(args) # Assume data passed has not been 'stacked', so stack it here. y_stack = np.cumsum(y, axis=0) From 66745486001025932d1c58b7d5bd55be88437925 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sat, 14 Apr 2012 10:47:33 -0400 Subject: [PATCH 05/13] Updated stackplot example. Stackplot example now reflects usage of variadic calling signature. --- examples/pylab_examples/stackplot_demo.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/pylab_examples/stackplot_demo.py b/examples/pylab_examples/stackplot_demo.py index eca1f78fa0da..0148dd8430a9 100644 --- a/examples/pylab_examples/stackplot_demo.py +++ b/examples/pylab_examples/stackplot_demo.py @@ -5,7 +5,14 @@ y = np.row_stack((fnx(), fnx(), fnx())) x = np.arange(10) +y1, y2, y3 = fnx(), fnx(), fnx() + fig = plt.figure() ax = fig.add_subplot(111) ax.stackplot(x, y) plt.show() + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.stackplot(x, y1, y2, y3) +plt.show() From 3e8fe6ed5b14f3c2ff29ae5dd494b4d855c1d19c Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sat, 14 Apr 2012 10:51:03 -0400 Subject: [PATCH 06/13] Update changelog to include stackplot. --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index bfe878021a4c..f590d9b11fb8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -32,6 +32,9 @@ the linear portion relative to the logarithmic portion to be adjusted. - MGD +2012-04-14 Added new plot style: stackplot. This new feature supports stacked + area plots. - Damon McDougall + 2012-04-06 When path clipping changes a LINETO to a MOVETO, it also changes any CLOSEPOLY command to a LINETO to the initial point. This fixes a problem with pdf and svg where the From 38a903f3a3841e070fd26040784fdac4fb015285 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sun, 22 Apr 2012 20:19:27 -0400 Subject: [PATCH 07/13] Stackplot now supports the same keyword aargs as matplotlib.Axes.fill_between(). This is a measure to make boilerplate.py not produce a pyplot.py file with syntax errors. It's also a sensible course of action considering new stackplot features will almost certainly require keyword arguments anyway. --- lib/matplotlib/axes.py | 4 ++-- lib/matplotlib/stackplot.py | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index ec5c8a21705d..26d9405d71f3 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -6409,8 +6409,8 @@ def quiver(self, *args, **kw): return q quiver.__doc__ = mquiver.Quiver.quiver_doc - def stackplot(self, x, *args): - return mstack.stackplot(self, x, *args) + def stackplot(self, x, *args, **kwargs): + return mstack.stackplot(self, x, *args, **kwargs) stackplot.__doc__ = mstack.stackplot.__doc__ def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py index 14bb923c0f56..9edf8544d8e9 100644 --- a/lib/matplotlib/stackplot.py +++ b/lib/matplotlib/stackplot.py @@ -12,7 +12,7 @@ __all__ = ['stackplot'] -def stackplot(axes, x, *args): +def stackplot(axes, x, *args, **kwargs): """Draws a stacked area plot. Parameters @@ -23,12 +23,14 @@ def stackplot(axes, x, *args): calls is legal: stackplot(x, y) # where y is MxN - staclplot(x, y1, y2, y3, y4) # where y1, y2, y3, y4, are all 1xN + staclplot(x, y1, y2, y3, y4) # where y1, y2, y3, y4, are all 1xNm + *kwargs* : All keyword arguments are those supported by + :func:`~matplotlib.Axes.fill_between` Returns ------- - *r* : A list of `matplotlib.collections.PolyCollection`, one for each - element in the stacked area plot. + *r* : A list of :class:`~matplotlib.collections.PolyCollection`, one for + each element in the stacked area plot. """ if len(args) == 1: @@ -42,9 +44,9 @@ def stackplot(axes, x, *args): r = [] # Color between x = 0 and the first array. - r.append(axes.fill_between(x, 0, y_stack[0,:], facecolor=axes._get_lines.color_cycle.next())) + r.append(axes.fill_between(x, 0, y_stack[0,:], facecolor=axes._get_lines.color_cycle.next(), **kwargs)) # Color between array i-1 and array i for i in xrange(len(y)-1): - r.append(axes.fill_between(x, y_stack[i-1,:], y_stack[i,:], facecolor=axes._get_lines.color_cycle.next())) + r.append(axes.fill_between(x, y_stack[i-1,:], y_stack[i,:], facecolor=axes._get_lines.color_cycle.next(), **kwargs)) return r From 91a233a33074873871fc4a80d506b36b3436925d Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sun, 22 Apr 2012 20:24:27 -0400 Subject: [PATCH 08/13] Fixed an issue where stackplot didn't fill stacked data in correct order. --- lib/matplotlib/stackplot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py index 9edf8544d8e9..df941c44e8e6 100644 --- a/lib/matplotlib/stackplot.py +++ b/lib/matplotlib/stackplot.py @@ -48,5 +48,5 @@ def stackplot(axes, x, *args, **kwargs): # Color between array i-1 and array i for i in xrange(len(y)-1): - r.append(axes.fill_between(x, y_stack[i-1,:], y_stack[i,:], facecolor=axes._get_lines.color_cycle.next(), **kwargs)) + r.append(axes.fill_between(x, y_stack[i,:], y_stack[i+1,:], facecolor=axes._get_lines.color_cycle.next(), **kwargs)) return r From 7b9387417ab72e9f1e35da09f97b54bda37cce99 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Sun, 22 Apr 2012 20:39:38 -0400 Subject: [PATCH 09/13] Added stackplot to list of pyplot commands. pyplot.py now contains the necessary information to make stackplot work inside of pyplot. --- boilerplate.py | 2 +- lib/matplotlib/pyplot.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/boilerplate.py b/boilerplate.py index 2426c0864b6f..b1a430a0f98f 100644 --- a/boilerplate.py +++ b/boilerplate.py @@ -69,7 +69,6 @@ def %(func)s(%(argspec)s): return %(ret)s """ - # Used for colormap functions CMAP_TEMPLATE = AUTOGEN_MSG + """ def {name}(): @@ -131,6 +130,7 @@ def boilerplate_gen(): 'semilogy', 'specgram', #'spy', + 'stackplot', 'stem', 'step', 'streamplot', diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 229355bab969..e2cf980417d1 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -2958,6 +2958,24 @@ def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, sci(ret[-1]) return ret +# This function was autogenerated by boilerplate.py. Do not edit as +# changes will be lost +@autogen_docstring(Axes.stackplot) +def stackplot(x, *args, **kwargs): + ax = gca() + # allow callers to override the hold state by passing hold=True|False + washold = ax.ishold() + hold = kwargs.pop('hold', None) + if hold is not None: + ax.hold(hold) + try: + ret = ax.stackplot(x, *args, **kwargs) + draw_if_interactive() + finally: + ax.hold(washold) + + return ret + # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost @autogen_docstring(Axes.stem) From a66ca21b447a39c6806f21ca73c8d0d4a87de847 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Mon, 23 Apr 2012 19:52:09 -0400 Subject: [PATCH 10/13] Added support for custom colour cycle. New keyword argument 'colors' can be passed to allow custom colouring of the stacked areas in a stacked area plot. --- lib/matplotlib/stackplot.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py index df941c44e8e6..255c8e2fb1b8 100644 --- a/lib/matplotlib/stackplot.py +++ b/lib/matplotlib/stackplot.py @@ -24,7 +24,11 @@ def stackplot(axes, x, *args, **kwargs): stackplot(x, y) # where y is MxN staclplot(x, y1, y2, y3, y4) # where y1, y2, y3, y4, are all 1xNm - *kwargs* : All keyword arguments are those supported by + + Keyword arguments: + *colors* : A list or tuple of colors. These will be cycled through and + used to colour the stacked areas. + All other keyword arguments are passed to :func:`~matplotlib.Axes.fill_between` Returns @@ -38,6 +42,10 @@ def stackplot(axes, x, *args, **kwargs): elif len(args) > 1: y = np.row_stack(args) + colors = kwargs.pop('colors', None) + if colors is not None: + axes.set_color_cycle(colors) + # Assume data passed has not been 'stacked', so stack it here. y_stack = np.cumsum(y, axis=0) From a3a35fb83db991d370b4a76b45fff74ce6cc2667 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Tue, 19 Jun 2012 10:28:32 +0100 Subject: [PATCH 11/13] Add stackplot to list of plotting commands. --- lib/matplotlib/pyplot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index e2cf980417d1..08b769271827 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1616,6 +1616,7 @@ def plotting(): until they have been closed; in interactive mode, show generally has no effect. specgram a spectrogram plot + stackplot make a stacked plot stem make a stem plot subplot make a subplot (numrows, numcols, axesnum) table add a table to the axes From 0fd841cd41407df484ead74110f7113de1b75a15 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Fri, 6 Jul 2012 00:34:25 +0100 Subject: [PATCH 12/13] Added stackplot unit test. Test images added. Unit test writted and unit test added to default tests in __init__.py --- lib/matplotlib/__init__.py | 3 +- .../test_stackplot/stackplot_test_image.pdf | Bin 0 -> 7516 bytes .../test_stackplot/stackplot_test_image.png | Bin 0 -> 20948 bytes .../test_stackplot/stackplot_test_image.svg | 661 ++++++++++++++++++ .../stackplot_test_image_pdf.png | Bin 0 -> 6612 bytes lib/matplotlib/tests/test_stackplot.py | 14 + 6 files changed, 677 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image.png create mode 100644 lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image_pdf.png create mode 100644 lib/matplotlib/tests/test_stackplot.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 0c4583f465f0..b9578b89d4e7 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -992,7 +992,8 @@ def tk_window_focus(): 'matplotlib.tests.test_text', 'matplotlib.tests.test_tightlayout', 'matplotlib.tests.test_delaunay', - 'matplotlib.tests.test_legend' + 'matplotlib.tests.test_legend', + 'matplotlib.tests.test_stackplot' ] def test(verbosity=1): diff --git a/lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image.pdf b/lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b922c19f06a6e53bc00fe57e601710566275c5da GIT binary patch literal 7516 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image_pdf.png b/lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image_pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..0860dc06f06b6b63bc6f6ba4022a420b4797a350 GIT binary patch literal 6612 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 Cyv@=8 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_stackplot.py b/lib/matplotlib/tests/test_stackplot.py new file mode 100644 index 000000000000..9c437595a6e7 --- /dev/null +++ b/lib/matplotlib/tests/test_stackplot.py @@ -0,0 +1,14 @@ +import numpy as np +import matplotlib +from matplotlib.testing.decorators import image_comparison +import matplotlib.pyplot as plt + +@image_comparison(baseline_images=['stackplot_test_image']) +def test_stackplot(): + fig = plt.figure() + x = np.linspace(0, 10, 10) + y1 = 1.0 * x + y2 = 2.0 * x + 1 + y3 = 3.0 * x + 2 + ax = fig.add_subplot(1, 1, 1) + ax.stackplot(x, y1, y2, y3) From cd629e5e4857808941d52e569dfa3e86fef20fa4 Mon Sep 17 00:00:00 2001 From: Damon McDougall Date: Fri, 6 Jul 2012 22:23:13 +0100 Subject: [PATCH 13/13] Removed superfluous file. --- .../test_stackplot/stackplot_test_image_pdf.png | Bin 6612 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image_pdf.png diff --git a/lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image_pdf.png b/lib/matplotlib/tests/baseline_images/test_stackplot/stackplot_test_image_pdf.png deleted file mode 100644 index 0860dc06f06b6b63bc6f6ba4022a420b4797a350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6612 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 Cyv@=8