From e4d46a0f675db1f8772efe8308ac31d359000c06 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Sat, 6 Oct 2018 15:39:03 -0700 Subject: [PATCH] Backport PR #12293: Make pyplot more tolerant wrt. 3rd-party subclasses. --- lib/matplotlib/pyplot.py | 202 ++++++++++++++++------------ lib/matplotlib/tests/test_pyplot.py | 5 + tools/boilerplate.py | 28 ++-- 3 files changed, 140 insertions(+), 95 deletions(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 5134ea184739..2a8fbc54fd4e 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -2387,7 +2387,8 @@ def _autogen_docstring(base): # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.acorr) def acorr(x, *, data=None, **kwargs): - return gca().acorr(x=x, data=data, **kwargs) + return gca().acorr( + x, **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2396,20 +2397,20 @@ def angle_spectrum( x, Fs=None, Fc=None, window=None, pad_to=None, sides=None, *, data=None, **kwargs): return gca().angle_spectrum( - x=x, Fs=Fs, Fc=Fc, window=window, pad_to=pad_to, sides=sides, - data=data, **kwargs) + x, Fs=Fs, Fc=Fc, window=window, pad_to=pad_to, sides=sides, + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.annotate) def annotate(s, xy, *args, **kwargs): - return gca().annotate(s=s, xy=xy, *args, **kwargs) + return gca().annotate(s, xy, *args, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.arrow) def arrow(x, y, dx, dy, **kwargs): - return gca().arrow(x=x, y=y, dx=dx, dy=dy, **kwargs) + return gca().arrow(x, y, dx, dy, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2427,7 +2428,7 @@ def axhline(y=0, xmin=0, xmax=1, **kwargs): # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.axhspan) def axhspan(ymin, ymax, xmin=0, xmax=1, **kwargs): - return gca().axhspan(ymin=ymin, ymax=ymax, xmin=xmin, xmax=xmax, **kwargs) + return gca().axhspan(ymin, ymax, xmin=xmin, xmax=xmax, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2445,7 +2446,7 @@ def axvline(x=0, ymin=0, ymax=1, **kwargs): # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.axvspan) def axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs): - return gca().axvspan(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, **kwargs) + return gca().axvspan(xmin, xmax, ymin=ymin, ymax=ymax, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2454,22 +2455,22 @@ def bar( x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs): return gca().bar( - x=x, height=height, width=width, bottom=bottom, align=align, - data=data, **kwargs) + x, height, width=width, bottom=bottom, align=align, + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.barbs) def barbs(*args, data=None, **kw): - return gca().barbs(*args, data=data, **kw) + return gca().barbs( + *args, **({"data": data} if data is not None else {}), **kw) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.barh) def barh(y, width, height=0.8, left=None, *, align='center', **kwargs): return gca().barh( - y=y, width=width, height=height, left=left, align=align, - **kwargs) + y, width, height=height, left=left, align=align, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2484,7 +2485,7 @@ def boxplot( whiskerprops=None, manage_xticks=True, autorange=False, zorder=None, *, data=None): return gca().boxplot( - x=x, notch=notch, sym=sym, vert=vert, whis=whis, + x, notch=notch, sym=sym, vert=vert, whis=whis, positions=positions, widths=widths, patch_artist=patch_artist, bootstrap=bootstrap, usermedians=usermedians, conf_intervals=conf_intervals, meanline=meanline, @@ -2493,14 +2494,16 @@ def boxplot( flierprops=flierprops, medianprops=medianprops, meanprops=meanprops, capprops=capprops, whiskerprops=whiskerprops, manage_xticks=manage_xticks, - autorange=autorange, zorder=zorder, data=data) + autorange=autorange, zorder=zorder, **({"data": data} if data + is not None else {})) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.broken_barh) def broken_barh(xranges, yrange, *, data=None, **kwargs): return gca().broken_barh( - xranges=xranges, yrange=yrange, data=data, **kwargs) + xranges, yrange, **({"data": data} if data is not None else + {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2512,7 +2515,7 @@ def cla(): # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.clabel) def clabel(CS, *args, **kwargs): - return gca().clabel(CS=CS, *args, **kwargs) + return gca().clabel(CS, *args, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2522,15 +2525,18 @@ def cohere( window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, *, data=None, **kwargs): return gca().cohere( - x=x, y=y, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, - window=window, noverlap=noverlap, pad_to=pad_to, sides=sides, - scale_by_freq=scale_by_freq, data=data, **kwargs) + x, y, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, window=window, + noverlap=noverlap, pad_to=pad_to, sides=sides, + scale_by_freq=scale_by_freq, **({"data": data} if data is not + None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @_autogen_docstring(Axes.contour) def contour(*args, data=None, **kwargs): - __ret = gca().contour(*args, data=data, **kwargs) + __ret = gca().contour( + *args, **({"data": data} if data is not None else {}), + **kwargs) if __ret._A is not None: sci(__ret) # noqa return __ret @@ -2538,7 +2544,9 @@ def contour(*args, data=None, **kwargs): # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @_autogen_docstring(Axes.contourf) def contourf(*args, data=None, **kwargs): - __ret = gca().contourf(*args, data=data, **kwargs) + __ret = gca().contourf( + *args, **({"data": data} if data is not None else {}), + **kwargs) if __ret._A is not None: sci(__ret) # noqa return __ret @@ -2550,10 +2558,10 @@ def csd( noverlap=None, pad_to=None, sides=None, scale_by_freq=None, return_line=None, *, data=None, **kwargs): return gca().csd( - x=x, y=y, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, - window=window, noverlap=noverlap, pad_to=pad_to, sides=sides, + x, y, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, window=window, + noverlap=noverlap, pad_to=pad_to, sides=sides, scale_by_freq=scale_by_freq, return_line=return_line, - data=data, **kwargs) + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2564,11 +2572,11 @@ def errorbar( uplims=False, xlolims=False, xuplims=False, errorevery=1, capthick=None, *, data=None, **kwargs): return gca().errorbar( - x=x, y=y, yerr=yerr, xerr=xerr, fmt=fmt, ecolor=ecolor, + x, y, yerr=yerr, xerr=xerr, fmt=fmt, ecolor=ecolor, elinewidth=elinewidth, capsize=capsize, barsabove=barsabove, lolims=lolims, uplims=uplims, xlolims=xlolims, xuplims=xuplims, errorevery=errorevery, capthick=capthick, - data=data, **kwargs) + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2578,16 +2586,18 @@ def eventplot( linelengths=1, linewidths=None, colors=None, linestyles='solid', *, data=None, **kwargs): return gca().eventplot( - positions=positions, orientation=orientation, - lineoffsets=lineoffsets, linelengths=linelengths, - linewidths=linewidths, colors=colors, linestyles=linestyles, - data=data, **kwargs) + positions, orientation=orientation, lineoffsets=lineoffsets, + linelengths=linelengths, linewidths=linewidths, colors=colors, + linestyles=linestyles, **({"data": data} if data is not None + else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.fill) def fill(*args, data=None, **kwargs): - return gca().fill(*args, data=data, **kwargs) + return gca().fill( + *args, **({"data": data} if data is not None else {}), + **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2596,8 +2606,8 @@ def fill_between( x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs): return gca().fill_between( - x=x, y1=y1, y2=y2, where=where, interpolate=interpolate, - step=step, data=data, **kwargs) + x, y1, y2=y2, where=where, interpolate=interpolate, step=step, + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2606,8 +2616,8 @@ def fill_betweenx( y, x1, x2=0, where=None, step=None, interpolate=False, *, data=None, **kwargs): return gca().fill_betweenx( - y=y, x1=x1, x2=x2, where=where, step=step, - interpolate=interpolate, data=data, **kwargs) + y, x1, x2=x2, where=where, step=step, interpolate=interpolate, + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2625,11 +2635,12 @@ def hexbin( reduce_C_function=np.mean, mincnt=None, marginals=False, *, data=None, **kwargs): __ret = gca().hexbin( - x=x, y=y, C=C, gridsize=gridsize, bins=bins, xscale=xscale, + x, y, C=C, gridsize=gridsize, bins=bins, xscale=xscale, yscale=yscale, extent=extent, cmap=cmap, norm=norm, vmin=vmin, vmax=vmax, alpha=alpha, linewidths=linewidths, edgecolors=edgecolors, reduce_C_function=reduce_C_function, - mincnt=mincnt, marginals=marginals, data=data, **kwargs) + mincnt=mincnt, marginals=marginals, **({"data": data} if data + is not None else {}), **kwargs) sci(__ret) return __ret @@ -2643,11 +2654,11 @@ def hist( label=None, stacked=False, normed=None, *, data=None, **kwargs): return gca().hist( - x=x, bins=bins, range=range, density=density, weights=weights, + x, bins=bins, range=range, density=density, weights=weights, cumulative=cumulative, bottom=bottom, histtype=histtype, align=align, orientation=orientation, rwidth=rwidth, log=log, color=color, label=label, stacked=stacked, normed=normed, - data=data, **kwargs) + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2656,8 +2667,9 @@ def hist2d( x, y, bins=10, range=None, normed=False, weights=None, cmin=None, cmax=None, *, data=None, **kwargs): __ret = gca().hist2d( - x=x, y=y, bins=bins, range=range, normed=normed, - weights=weights, cmin=cmin, cmax=cmax, data=data, **kwargs) + x, y, bins=bins, range=range, normed=normed, weights=weights, + cmin=cmin, cmax=cmax, **({"data": data} if data is not None + else {}), **kwargs) sci(__ret[-1]) return __ret @@ -2668,8 +2680,9 @@ def hlines( y, xmin, xmax, colors='k', linestyles='solid', label='', *, data=None, **kwargs): return gca().hlines( - y=y, xmin=xmin, xmax=xmax, colors=colors, - linestyles=linestyles, label=label, data=data, **kwargs) + y, xmin, xmax, colors=colors, linestyles=linestyles, + label=label, **({"data": data} if data is not None else {}), + **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2680,11 +2693,12 @@ def imshow( shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, *, data=None, **kwargs): __ret = gca().imshow( - X=X, cmap=cmap, norm=norm, aspect=aspect, + X, cmap=cmap, norm=norm, aspect=aspect, interpolation=interpolation, alpha=alpha, vmin=vmin, vmax=vmax, origin=origin, extent=extent, shape=shape, filternorm=filternorm, filterrad=filterrad, imlim=imlim, - resample=resample, url=url, data=data, **kwargs) + resample=resample, url=url, **({"data": data} if data is not + None else {}), **kwargs) sci(__ret) return __ret @@ -2713,8 +2727,9 @@ def magnitude_spectrum( x, Fs=None, Fc=None, window=None, pad_to=None, sides=None, scale=None, *, data=None, **kwargs): return gca().magnitude_spectrum( - x=x, Fs=Fs, Fc=Fc, window=window, pad_to=pad_to, sides=sides, - scale=scale, data=data, **kwargs) + x, Fs=Fs, Fc=Fc, window=window, pad_to=pad_to, sides=sides, + scale=scale, **({"data": data} if data is not None else {}), + **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2742,7 +2757,8 @@ def pcolor( vmax=None, data=None, **kwargs): __ret = gca().pcolor( *args, alpha=alpha, norm=norm, cmap=cmap, vmin=vmin, - vmax=vmax, data=data, **kwargs) + vmax=vmax, **({"data": data} if data is not None else {}), + **kwargs) sci(__ret) return __ret @@ -2756,7 +2772,7 @@ def pcolormesh( __ret = gca().pcolormesh( *args, alpha=alpha, norm=norm, cmap=cmap, vmin=vmin, vmax=vmax, shading=shading, antialiased=antialiased, - data=data, **kwargs) + **({"data": data} if data is not None else {}), **kwargs) sci(__ret) return __ret @@ -2767,8 +2783,8 @@ def phase_spectrum( x, Fs=None, Fc=None, window=None, pad_to=None, sides=None, *, data=None, **kwargs): return gca().phase_spectrum( - x=x, Fs=Fs, Fc=Fc, window=window, pad_to=pad_to, sides=sides, - data=data, **kwargs) + x, Fs=Fs, Fc=Fc, window=window, pad_to=pad_to, sides=sides, + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2780,19 +2796,21 @@ def pie( wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None): return gca().pie( - x=x, explode=explode, labels=labels, colors=colors, + x, explode=explode, labels=labels, colors=colors, autopct=autopct, pctdistance=pctdistance, shadow=shadow, labeldistance=labeldistance, startangle=startangle, radius=radius, counterclock=counterclock, wedgeprops=wedgeprops, textprops=textprops, center=center, - frame=frame, rotatelabels=rotatelabels, data=data) + frame=frame, rotatelabels=rotatelabels, **({"data": data} if + data is not None else {})) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.plot) def plot(*args, scalex=True, scaley=True, data=None, **kwargs): return gca().plot( - *args, scalex=scalex, scaley=scaley, data=data, **kwargs) + *args, scalex=scalex, scaley=scaley, **({"data": data} if data + is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2801,8 +2819,8 @@ def plot_date( x, y, fmt='o', tz=None, xdate=True, ydate=False, *, data=None, **kwargs): return gca().plot_date( - x=x, y=y, fmt=fmt, tz=tz, xdate=xdate, ydate=ydate, data=data, - **kwargs) + x, y, fmt=fmt, tz=tz, xdate=xdate, ydate=ydate, **({"data": + data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2812,16 +2830,17 @@ def psd( noverlap=None, pad_to=None, sides=None, scale_by_freq=None, return_line=None, *, data=None, **kwargs): return gca().psd( - x=x, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, window=window, + x, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, window=window, noverlap=noverlap, pad_to=pad_to, sides=sides, scale_by_freq=scale_by_freq, return_line=return_line, - data=data, **kwargs) + **({"data": data} if data is not None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @_autogen_docstring(Axes.quiver) def quiver(*args, data=None, **kw): - __ret = gca().quiver(*args, data=data, **kw) + __ret = gca().quiver( + *args, **({"data": data} if data is not None else {}), **kw) sci(__ret) return __ret @@ -2829,7 +2848,7 @@ def quiver(*args, data=None, **kw): # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.quiverkey) def quiverkey(Q, X, Y, U, label, **kw): - return gca().quiverkey(Q=Q, X=X, Y=Y, U=U, label=label, **kw) + return gca().quiverkey(Q, X, Y, U, label, **kw) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2839,9 +2858,10 @@ def scatter( vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs): __ret = gca().scatter( - x=x, y=y, s=s, c=c, marker=marker, cmap=cmap, norm=norm, + x, y, s=s, c=c, marker=marker, cmap=cmap, norm=norm, vmin=vmin, vmax=vmax, alpha=alpha, linewidths=linewidths, - verts=verts, edgecolors=edgecolors, data=data, **kwargs) + verts=verts, edgecolors=edgecolors, **({"data": data} if data + is not None else {}), **kwargs) sci(__ret) return __ret @@ -2866,10 +2886,11 @@ def specgram( sides=None, scale_by_freq=None, mode=None, scale=None, vmin=None, vmax=None, *, data=None, **kwargs): __ret = gca().specgram( - x=x, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, window=window, + x, NFFT=NFFT, Fs=Fs, Fc=Fc, detrend=detrend, window=window, noverlap=noverlap, cmap=cmap, xextent=xextent, pad_to=pad_to, sides=sides, scale_by_freq=scale_by_freq, mode=mode, - scale=scale, vmin=vmin, vmax=vmax, data=data, **kwargs) + scale=scale, vmin=vmin, vmax=vmax, **({"data": data} if data + is not None else {}), **kwargs) sci(__ret[-1]) return __ret @@ -2880,8 +2901,8 @@ def spy( Z, precision=0, marker=None, markersize=None, aspect='equal', origin='upper', **kwargs): __ret = gca().spy( - Z=Z, precision=precision, marker=marker, - markersize=markersize, aspect=aspect, origin=origin, **kwargs) + Z, precision=precision, marker=marker, markersize=markersize, + aspect=aspect, origin=origin, **kwargs) if isinstance(__ret, cm.ScalarMappable): sci(__ret) # noqa return __ret @@ -2889,7 +2910,9 @@ def spy( # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.stackplot) def stackplot(x, *args, data=None, **kwargs): - return gca().stackplot(x=x, *args, data=data, **kwargs) + return gca().stackplot( + x, *args, **({"data": data} if data is not None else {}), + **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2899,13 +2922,16 @@ def stem( label=None, data=None): return gca().stem( *args, linefmt=linefmt, markerfmt=markerfmt, basefmt=basefmt, - bottom=bottom, label=label, data=data) + bottom=bottom, label=label, **({"data": data} if data is not + None else {})) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.step) def step(x, y, *args, where='pre', data=None, **kwargs): - return gca().step(x=x, y=y, *args, where=where, data=data, **kwargs) + return gca().step( + x, y, *args, where=where, **({"data": data} if data is not + None else {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2916,12 +2942,13 @@ def streamplot( transform=None, zorder=None, start_points=None, maxlength=4.0, integration_direction='both', *, data=None): __ret = gca().streamplot( - x=x, y=y, u=u, v=v, density=density, linewidth=linewidth, - color=color, cmap=cmap, norm=norm, arrowsize=arrowsize, + x, y, u, v, density=density, linewidth=linewidth, color=color, + cmap=cmap, norm=norm, arrowsize=arrowsize, arrowstyle=arrowstyle, minlength=minlength, transform=transform, zorder=zorder, start_points=start_points, maxlength=maxlength, - integration_direction=integration_direction, data=data) + integration_direction=integration_direction, **({"data": data} + if data is not None else {})) sci(__ret.lines) return __ret @@ -2935,8 +2962,7 @@ def table(**kwargs): # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.text) def text(x, y, s, fontdict=None, withdash=False, **kwargs): - return gca().text( - x=x, y=y, s=s, fontdict=fontdict, withdash=withdash, **kwargs) + return gca().text(x, y, s, fontdict=fontdict, withdash=withdash, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -2993,10 +3019,10 @@ def violinplot( showmeans=False, showextrema=True, showmedians=False, points=100, bw_method=None, *, data=None): return gca().violinplot( - dataset=dataset, positions=positions, vert=vert, - widths=widths, showmeans=showmeans, showextrema=showextrema, + dataset, positions=positions, vert=vert, widths=widths, + showmeans=showmeans, showextrema=showextrema, showmedians=showmedians, points=points, bw_method=bw_method, - data=data) + **({"data": data} if data is not None else {})) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -3005,8 +3031,9 @@ def vlines( x, ymin, ymax, colors='k', linestyles='solid', label='', *, data=None, **kwargs): return gca().vlines( - x=x, ymin=ymin, ymax=ymax, colors=colors, - linestyles=linestyles, label=label, data=data, **kwargs) + x, ymin, ymax, colors=colors, linestyles=linestyles, + label=label, **({"data": data} if data is not None else {}), + **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @@ -3015,47 +3042,48 @@ def xcorr( x, y, normed=True, detrend=mlab.detrend_none, usevlines=True, maxlags=10, *, data=None, **kwargs): return gca().xcorr( - x=x, y=y, normed=normed, detrend=detrend, usevlines=usevlines, - maxlags=maxlags, data=data, **kwargs) + x, y, normed=normed, detrend=detrend, usevlines=usevlines, + maxlags=maxlags, **({"data": data} if data is not None else + {}), **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes._sci) def sci(im): - return gca()._sci(im=im) + return gca()._sci(im) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.set_title) def title(label, fontdict=None, loc='center', pad=None, **kwargs): return gca().set_title( - label=label, fontdict=fontdict, loc=loc, pad=pad, **kwargs) + label, fontdict=fontdict, loc=loc, pad=pad, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.set_xlabel) def xlabel(xlabel, fontdict=None, labelpad=None, **kwargs): return gca().set_xlabel( - xlabel=xlabel, fontdict=fontdict, labelpad=labelpad, **kwargs) + xlabel, fontdict=fontdict, labelpad=labelpad, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.set_ylabel) def ylabel(ylabel, fontdict=None, labelpad=None, **kwargs): return gca().set_ylabel( - ylabel=ylabel, fontdict=fontdict, labelpad=labelpad, **kwargs) + ylabel, fontdict=fontdict, labelpad=labelpad, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.set_xscale) def xscale(value, **kwargs): - return gca().set_xscale(value=value, **kwargs) + return gca().set_xscale(value, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. @docstring.copy_dedent(Axes.set_yscale) def yscale(value, **kwargs): - return gca().set_yscale(value=value, **kwargs) + return gca().set_yscale(value, **kwargs) # Autogenerated by boilerplate.py. Do not edit as changes will be lost. diff --git a/lib/matplotlib/tests/test_pyplot.py b/lib/matplotlib/tests/test_pyplot.py index b3bb30474f04..e5ce1b8bb212 100644 --- a/lib/matplotlib/tests/test_pyplot.py +++ b/lib/matplotlib/tests/test_pyplot.py @@ -31,3 +31,8 @@ def test_pyplot_box(): assert not ax.get_frame_on() plt.box() assert ax.get_frame_on() + + +def test_stackplot_smoke(): + # Small smoke test for stackplot (see #12405) + plt.stackplot([1, 2, 3], [1, 2, 3]) diff --git a/tools/boilerplate.py b/tools/boilerplate.py index 3012ef864e89..71db0d4f4cfa 100644 --- a/tools/boilerplate.py +++ b/tools/boilerplate.py @@ -213,16 +213,28 @@ def __repr__(self): sig = '(\n' + text_wrapper.fill(sig).replace('(', '', 1) # How to call the wrapped function. - call = '(' + ', '.join( - ('{0}={0}' if param.kind in [Parameter.POSITIONAL_OR_KEYWORD, - Parameter.KEYWORD_ONLY] else - '*{0}' if param.kind is Parameter.VAR_POSITIONAL else - '**{0}' if param.kind is Parameter.VAR_KEYWORD else - # Intentionally crash for Parameter.POSITIONAL_ONLY. - None).format(param.name) + call = '(' + ', '.join(( + # Pass "intended-as-positional" parameters positionally to avoid + # forcing third-party subclasses to reproduce the parameter names. + '{0}' + if param.kind in [Parameter.POSITIONAL_OR_KEYWORD] + and param.default is Parameter.empty else + # Only pass the data kwarg if it is actually set, to avoid forcing + # third-party subclasses to support it. + '**({{"data": data}} if data is not None else {{}})' + if param.name == "data" else + '{0}={0}' + if param.kind in [Parameter.POSITIONAL_OR_KEYWORD, + Parameter.KEYWORD_ONLY] else + '*{0}' + if param.kind is Parameter.VAR_POSITIONAL else + '**{0}' + if param.kind is Parameter.VAR_KEYWORD else + # Intentionally crash for Parameter.POSITIONAL_ONLY. + None).format(param.name) for param in params) + ')' MAX_CALL_PREFIX = 18 # len(' __ret = gca().') - if MAX_CALL_PREFIX + len(func) + len(call) >= 80: + if MAX_CALL_PREFIX + max(len(func), len(real_name)) + len(call) >= 80: call = '(\n' + text_wrapper.fill(call[1:]) # Bail out in case of name collision.