From 684dbf6adb1357e62760471a8d072b01dce7ad35 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Apr 2016 16:38:19 -0400 Subject: [PATCH 1/8] Fix #5577, Fix #5489: Color cycle handling --- .../specialty_plots/advanced_hillshading.py | 8 +++---- .../topographic_hillshading.py | 5 ++-- lib/matplotlib/colors.py | 23 ++++++++----------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/examples/specialty_plots/advanced_hillshading.py b/examples/specialty_plots/advanced_hillshading.py index 3d6af635e611..bbfd71c35aec 100644 --- a/examples/specialty_plots/advanced_hillshading.py +++ b/examples/specialty_plots/advanced_hillshading.py @@ -16,7 +16,7 @@ def display_colorbar(): rgb = ls.shade(z, cmap) fig, ax = plt.subplots() - ax.imshow(rgb) + ax.imshow(rgb, interpolation="bilinear") # Use a proxy artist for the colorbar... im = ax.imshow(z, cmap=cmap) @@ -39,11 +39,11 @@ def avoid_outliers(): fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(8, 4.5)) rgb = ls.shade(z, plt.cm.copper) - ax1.imshow(rgb) + ax1.imshow(rgb, interpolation="bilinear") ax1.set_title('Full range of data') rgb = ls.shade(z, plt.cm.copper, vmin=-10, vmax=10) - ax2.imshow(rgb) + ax2.imshow(rgb, interpolation="bilinear") ax2.set_title('Manually set range') fig.suptitle('Avoiding Outliers in Shaded Plots', size='x-large') @@ -62,7 +62,7 @@ def shade_other_data(): rgb = ls.shade_rgb(cmap(norm(z2)), z1) fig, ax = plt.subplots() - ax.imshow(rgb) + ax.imshow(rgb, interpolation="bilinear") ax.set_title('Shade by one variable, color by another', size='x-large') display_colorbar() diff --git a/examples/specialty_plots/topographic_hillshading.py b/examples/specialty_plots/topographic_hillshading.py index 751ea6fe93c7..83502599c593 100644 --- a/examples/specialty_plots/topographic_hillshading.py +++ b/examples/specialty_plots/topographic_hillshading.py @@ -44,13 +44,14 @@ # Vary vertical exaggeration and blend mode and plot all combinations for col, ve in zip(axes.T, [0.1, 1, 10]): # Show the hillshade intensity image in the first row - col[0].imshow(ls.hillshade(z, vert_exag=ve, dx=dx, dy=dy), cmap='gray') + col[0].imshow(ls.hillshade(z, vert_exag=ve, dx=dx, dy=dy), cmap='gray', + interpolation="bilinear") # Place hillshaded plots with different blend modes in the rest of the rows for ax, mode in zip(col[1:], ['hsv', 'overlay', 'soft']): rgb = ls.shade(z, cmap=cmap, blend_mode=mode, vert_exag=ve, dx=dx, dy=dy) - ax.imshow(rgb) + ax.imshow(rgb, interpolation="bilinear") # Label rows and columns for ax, ve in zip(axes[0], [0.1, 1, 10]): diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 86011f06c23f..f95f29399595 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1425,9 +1425,6 @@ class LightSource(object): clockwise from north and elevation up from the zero plane of the surface. The :meth:`shade` is used to produce "shaded" rgb values for a data array. - :meth:`shade_rgb` can be used to combine an rgb image with - The :meth:`shade_rgb` - The :meth:`hillshade` produces an illumination map of a surface. """ def __init__(self, azdeg=315, altdeg=45, hsv_min_val=0, hsv_max_val=1, hsv_min_sat=1, hsv_max_sat=0): @@ -1609,7 +1606,7 @@ def shade(self, data, cmap, norm=None, blend_mode='overlay', vmin=None, rgb0[..., :3] = rgb1[..., :3] return rgb0 - def shade_rgb(self, rgb, elevation, fraction=1., blend_mode='hsv', + def shade_rgb(self, rgb, elevation, fraction=1., blend_mode='overlay', vert_exag=1, dx=1, dy=1, **kwargs): """ Take the input RGB array (ny*nx*3) adjust their color values @@ -1631,15 +1628,15 @@ def shade_rgb(self, rgb, elevation, fraction=1., blend_mode='hsv', beyond 0 or 1). Note that this is not visually or mathematically the same as vertical exaggeration. blend_mode : {'hsv', 'overlay', 'soft'} or callable, optional - The type of blending used to combine the colormapped data values - with the illumination intensity. For backwards compatibility, this - defaults to "hsv". Note that for most topographic surfaces, - "overlay" or "soft" appear more visually realistic. If a - user-defined function is supplied, it is expected to combine an - MxNx3 RGB array of floats (ranging 0 to 1) with an MxNx1 hillshade - array (also 0 to 1). (Call signature `func(rgb, illum, **kwargs)`) - Additional kwargs supplied to this function will be passed on to - the *blend_mode* function. + The type of blending used to combine the colormapped data + values with the illumination intensity. Note that for + most topographic surfaces, "overlay" or "soft" appear more + visually realistic. If a user-defined function is + supplied, it is expected to combine an MxNx3 RGB array of + floats (ranging 0 to 1) with an MxNx1 hillshade array + (also 0 to 1). (Call signature `func(rgb, illum, + **kwargs)`) Additional kwargs supplied to this function + will be passed on to the *blend_mode* function. vert_exag : number, optional The amount to exaggerate the elevation values by when calculating illumination. This can be used either to correct for differences in From 48d5b6b8fea7b70c49e5a7400c2c4fa5841bdd36 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Apr 2016 17:43:02 -0400 Subject: [PATCH 2/8] Fix #5990. Scatter follows color cycle --- examples/pylab_examples/color_demo.py | 7 +- .../specialty_plots/advanced_hillshading.py | 8 +- .../topographic_hillshading.py | 5 +- lib/matplotlib/axes/_axes.py | 50 ++++++++---- lib/matplotlib/axes/_base.py | 20 ++++- lib/matplotlib/colors.py | 73 +++++++++++++++--- lib/matplotlib/rcsetup.py | 17 ++-- lib/matplotlib/sankey.py | 14 ++-- lib/matplotlib/stackplot.py | 10 +-- lib/matplotlib/streamplot.py | 4 +- .../test_cycles/lineprop_cycle_basic.png | Bin 35049 -> 41852 bytes lib/mpl_toolkits/mplot3d/axes3d.py | 16 +++- matplotlibrc.template | 12 +-- 13 files changed, 168 insertions(+), 68 deletions(-) diff --git a/examples/pylab_examples/color_demo.py b/examples/pylab_examples/color_demo.py index 1d471b0086a9..3ccf07a2e1a2 100755 --- a/examples/pylab_examples/color_demo.py +++ b/examples/pylab_examples/color_demo.py @@ -11,6 +11,9 @@ 4) as a string representing a floating point number from 0 to 1, corresponding to shades of gray. + 5) as a special color "Cn", where n is a number 0-9 specifying the + nth color in the currently active color cycle. + See help(colors) for more info. """ import matplotlib.pyplot as plt @@ -20,8 +23,8 @@ #subplot(111, facecolor='#ababab') t = np.arange(0.0, 2.0, 0.01) s = np.sin(2*np.pi*t) -plt.plot(t, s, 'y') -plt.xlabel('time (s)', color='r') +plt.plot(t, s, 'C0') +plt.xlabel('time (s)', color='C0') plt.ylabel('voltage (mV)', color='0.5') # grayscale color plt.title('About as silly as it gets, folks', color='#afeeee') plt.show() diff --git a/examples/specialty_plots/advanced_hillshading.py b/examples/specialty_plots/advanced_hillshading.py index bbfd71c35aec..3d6af635e611 100644 --- a/examples/specialty_plots/advanced_hillshading.py +++ b/examples/specialty_plots/advanced_hillshading.py @@ -16,7 +16,7 @@ def display_colorbar(): rgb = ls.shade(z, cmap) fig, ax = plt.subplots() - ax.imshow(rgb, interpolation="bilinear") + ax.imshow(rgb) # Use a proxy artist for the colorbar... im = ax.imshow(z, cmap=cmap) @@ -39,11 +39,11 @@ def avoid_outliers(): fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(8, 4.5)) rgb = ls.shade(z, plt.cm.copper) - ax1.imshow(rgb, interpolation="bilinear") + ax1.imshow(rgb) ax1.set_title('Full range of data') rgb = ls.shade(z, plt.cm.copper, vmin=-10, vmax=10) - ax2.imshow(rgb, interpolation="bilinear") + ax2.imshow(rgb) ax2.set_title('Manually set range') fig.suptitle('Avoiding Outliers in Shaded Plots', size='x-large') @@ -62,7 +62,7 @@ def shade_other_data(): rgb = ls.shade_rgb(cmap(norm(z2)), z1) fig, ax = plt.subplots() - ax.imshow(rgb, interpolation="bilinear") + ax.imshow(rgb) ax.set_title('Shade by one variable, color by another', size='x-large') display_colorbar() diff --git a/examples/specialty_plots/topographic_hillshading.py b/examples/specialty_plots/topographic_hillshading.py index 83502599c593..751ea6fe93c7 100644 --- a/examples/specialty_plots/topographic_hillshading.py +++ b/examples/specialty_plots/topographic_hillshading.py @@ -44,14 +44,13 @@ # Vary vertical exaggeration and blend mode and plot all combinations for col, ve in zip(axes.T, [0.1, 1, 10]): # Show the hillshade intensity image in the first row - col[0].imshow(ls.hillshade(z, vert_exag=ve, dx=dx, dy=dy), cmap='gray', - interpolation="bilinear") + col[0].imshow(ls.hillshade(z, vert_exag=ve, dx=dx, dy=dy), cmap='gray') # Place hillshaded plots with different blend modes in the rest of the rows for ax, mode in zip(col[1:], ['hsv', 'overlay', 'soft']): rgb = ls.shade(z, cmap=cmap, blend_mode=mode, vert_exag=ve, dx=dx, dy=dy) - ax.imshow(rgb, interpolation="bilinear") + ax.imshow(rgb) # Label rows and columns for ax, ve in zip(axes[0], [0.1, 1, 10]): diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 3ea8f26dcd61..184186fe738d 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4,6 +4,7 @@ from matplotlib.externals import six from matplotlib.externals.six.moves import reduce, xrange, zip, zip_longest +import itertools import math import warnings @@ -2458,7 +2459,7 @@ def pie(self, x, explode=None, labels=None, colors=None, Call signature:: pie(x, explode=None, labels=None, - colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'), + colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, @@ -2478,7 +2479,8 @@ def pie(self, x, explode=None, labels=None, colors=None, *colors*: [ *None* | color sequence ] A sequence of matplotlib color args through which the pie chart - will cycle. + will cycle. If `None`, will use the colors in the currently + active cycle. *labels*: [ *None* | len(x) sequence of strings ] A sequence of strings providing the labels for each wedge @@ -2567,7 +2569,11 @@ def pie(self, x, explode=None, labels=None, colors=None, if len(x) != len(explode): raise ValueError("'explode' must be of length 'x'") if colors is None: - colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w') + get_next_color = self._get_patches_for_fill.get_next_color + else: + color_cycle = itertools.cycle(colors) + def get_next_color(): + return six.next(color_cycle) if radius is None: radius = 1 @@ -2603,7 +2609,7 @@ def pie(self, x, explode=None, labels=None, colors=None, w = mpatches.Wedge((x, y), radius, 360. * min(theta1, theta2), 360. * max(theta1, theta2), - facecolor=colors[i % len(colors)], + facecolor=get_next_color(), **wedgeprops) slices.append(w) self.add_patch(w) @@ -3023,8 +3029,8 @@ def xywhere(xs, ys, mask): l0, = self.plot(x, y, fmt, label='_nolegend_', **kwargs) if ecolor is None: - if l0 is None and 'color' in self._get_lines._prop_keys: - ecolor = next(self._get_lines.prop_cycler)['color'] + if l0 is None: + ecolor = self._get_lines.get_next_color() else: ecolor = l0.get_color() @@ -3846,7 +3852,10 @@ def scatter(self, x, y, s=None, c=None, marker='o', cmap=None, norm=None, if facecolors is not None: c = facecolors else: - c = 'b' # The original default + if rcParams['_internal.classic_mode']: + c = 'b' # The original default + else: + c = self._get_patches_for_fill.get_next_color() if edgecolors is None and not rcParams['_internal.classic_mode']: edgecolors = 'face' @@ -6019,9 +6028,8 @@ def _normalize_input(inp, ename='input'): raise ValueError( 'weights should have the same shape as x') - if color is None and 'color' in self._get_lines._prop_keys: - color = [next(self._get_lines.prop_cycler)['color'] - for i in xrange(nx)] + if color is None: + color = [self._get_lines.get_next_color() for i in xrange(nx)] else: color = mcolors.colorConverter.to_rgba_array(color) if len(color) != nx: @@ -7507,6 +7515,12 @@ def violin(self, vpstats, positions=None, vert=True, widths=0.5, perp_lines = self.vlines par_lines = self.hlines + if rcParams['_internal.classic_mode']: + fillcolor = 'y' + edgecolor = 'r' + else: + fillcolor = edgecolor = self._get_lines.get_next_color() + # Render violins bodies = [] for stats, pos, width in zip(vpstats, positions, widths): @@ -7517,7 +7531,7 @@ def violin(self, vpstats, positions=None, vert=True, widths=0.5, bodies += [fill(stats['coords'], -vals + pos, vals + pos, - facecolor='y', + facecolor=fillcolor, alpha=0.3)] means.append(stats['mean']) mins.append(stats['min']) @@ -7527,20 +7541,24 @@ def violin(self, vpstats, positions=None, vert=True, widths=0.5, # Render means if showmeans: - artists['cmeans'] = perp_lines(means, pmins, pmaxes, colors='r') + artists['cmeans'] = perp_lines(means, pmins, pmaxes, + colors=edgecolor) # Render extrema if showextrema: - artists['cmaxes'] = perp_lines(maxes, pmins, pmaxes, colors='r') - artists['cmins'] = perp_lines(mins, pmins, pmaxes, colors='r') - artists['cbars'] = par_lines(positions, mins, maxes, colors='r') + artists['cmaxes'] = perp_lines(maxes, pmins, pmaxes, + colors=edgecolor) + artists['cmins'] = perp_lines(mins, pmins, pmaxes, + colors=edgecolor) + artists['cbars'] = par_lines(positions, mins, maxes, + colors=edgecolor) # Render medians if showmedians: artists['cmedians'] = perp_lines(medians, pmins, pmaxes, - colors='r') + colors=edgecolor) return artists diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index c11bb9c3af33..79084dc377da 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -52,6 +52,7 @@ def _process_plot_format(fmt): * 'ko': black circles * '.b': blue dots * 'r--': red dashed lines + * 'C2--': the third color in the color cycle, dashed lines .. seealso:: @@ -97,7 +98,9 @@ def _process_plot_format(fmt): chars = [c for c in fmt] - for c in chars: + i = 0 + while i < len(chars): + c = chars[i] if c in mlines.lineStyles: if linestyle is not None: raise ValueError( @@ -113,9 +116,14 @@ def _process_plot_format(fmt): raise ValueError( 'Illegal format string "%s"; two color symbols' % fmt) color = c + elif c == 'C' and i < len(chars) - 1: + color_cycle_number = int(chars[i + 1]) + color = mcolors.colorConverter._get_nth_color(color_cycle_number) + i += 1 else: raise ValueError( 'Unrecognized character %c in format string' % c) + i += 1 if linestyle is None and marker is None: linestyle = rcParams['lines.linestyle'] @@ -161,6 +169,10 @@ def set_prop_cycle(self, *args, **kwargs): else: prop_cycler = cycler(*args, **kwargs) + # Make sure the cycler always has at least one color + if 'color' not in prop_cycler.keys: + prop_cycler = prop_cycler * cycler('color', ['k']) + self.prop_cycler = itertools.cycle(prop_cycler) # This should make a copy self._prop_keys = prop_cycler.keys @@ -186,6 +198,12 @@ def __call__(self, *args, **kwargs): ret = self._grab_next_args(*args, **kwargs) return ret + def get_next_color(self): + """ + Return the next color in the cycle. + """ + return six.next(self.prop_cycler)['color'] + def set_lineprops(self, line, **kwargs): assert self.command == 'plot', 'set_lineprops only works with "plot"' line.set(**kwargs) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index f95f29399595..a7349dcd55a4 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -31,6 +31,12 @@ - k: black - w: white +To use the colors that are part of the active color cycle in the current style, +use `C` followed by a digit. For example: + + - `C0`: The first color in the cycle + - `C1`: The second color in the cycle + Gray shades can be given as a string encoding a float in the 0-1 range, e.g.:: color = '0.75' @@ -67,6 +73,19 @@ def is_color_like(c): 'Return *True* if *c* can be converted to *RGB*' + + # Special-case the N-th color cycle syntax, because it's parsing + # needs to be deferred. We may be reading a value from rcParams + # here before the color_cycle rcParam has been parsed. + if isinstance(c, bytes): + match = re.match(b'^C[0-9]$', c) + if match is not None: + return True + elif isinstance(c, six.text_type): + match = re.match('^C[0-9]$', c) + if match is not None: + return True + try: colorConverter.to_rgb(c) return True @@ -114,9 +133,36 @@ class ColorConverter(object): 'k': (0, 0, 0), 'w': (1, 1, 1)} + _prop_cycler = None + cache = {} CN_LOOKUPS = [COLOR_NAMES[k] for k in ['css4', 'xkcd']] + @classmethod + def _get_nth_color(cls, val): + """ + Get the Nth color in the current color cycle. If N is greater + than the number of colors in the cycle, it is wrapped around. + """ + from matplotlib.rcsetup import cycler + from matplotlib import rcParams + + prop_cycler = rcParams['axes.prop_cycle'] + if prop_cycler is None and 'axes.color_cycle' in rcParams: + clist = rcParams['axes.color_cycle'] + prop_cycler = cycler('color', clist) + + colors = prop_cycler._transpose()['color'] + return colors[val % len(colors)] + + @classmethod + def _parse_nth_color(cls, val): + match = re.match('^C[0-9]$', val) + if match is not None: + return cls._get_nth_color(int(val[1])) + + raise ValueError("Not a color cycle color") + def to_rgb(self, arg): """ Returns an *RGB* tuple of three floats from 0-1. @@ -154,6 +200,10 @@ def to_rgb(self, arg): argl = arg.lower() color = self.colors.get(argl, None) if color is None: + try: + argl = self._parse_nth_color(arg) + except ValueError: + pass for cmapping in self.CN_LOOKUPS: str1 = cmapping.get(argl, argl) if str1 != argl: @@ -1425,6 +1475,9 @@ class LightSource(object): clockwise from north and elevation up from the zero plane of the surface. The :meth:`shade` is used to produce "shaded" rgb values for a data array. + :meth:`shade_rgb` can be used to combine an rgb image with + The :meth:`shade_rgb` + The :meth:`hillshade` produces an illumination map of a surface. """ def __init__(self, azdeg=315, altdeg=45, hsv_min_val=0, hsv_max_val=1, hsv_min_sat=1, hsv_max_sat=0): @@ -1606,7 +1659,7 @@ def shade(self, data, cmap, norm=None, blend_mode='overlay', vmin=None, rgb0[..., :3] = rgb1[..., :3] return rgb0 - def shade_rgb(self, rgb, elevation, fraction=1., blend_mode='overlay', + def shade_rgb(self, rgb, elevation, fraction=1., blend_mode='hsv', vert_exag=1, dx=1, dy=1, **kwargs): """ Take the input RGB array (ny*nx*3) adjust their color values @@ -1628,15 +1681,15 @@ def shade_rgb(self, rgb, elevation, fraction=1., blend_mode='overlay', beyond 0 or 1). Note that this is not visually or mathematically the same as vertical exaggeration. blend_mode : {'hsv', 'overlay', 'soft'} or callable, optional - The type of blending used to combine the colormapped data - values with the illumination intensity. Note that for - most topographic surfaces, "overlay" or "soft" appear more - visually realistic. If a user-defined function is - supplied, it is expected to combine an MxNx3 RGB array of - floats (ranging 0 to 1) with an MxNx1 hillshade array - (also 0 to 1). (Call signature `func(rgb, illum, - **kwargs)`) Additional kwargs supplied to this function - will be passed on to the *blend_mode* function. + The type of blending used to combine the colormapped data values + with the illumination intensity. For backwards compatibility, this + defaults to "hsv". Note that for most topographic surfaces, + "overlay" or "soft" appear more visually realistic. If a + user-defined function is supplied, it is expected to combine an + MxNx3 RGB array of floats (ranging 0 to 1) with an MxNx1 hillshade + array (also 0 to 1). (Call signature `func(rgb, illum, **kwargs)`) + Additional kwargs supplied to this function will be passed on to + the *blend_mode* function. vert_exag : number, optional The amount to exaggerate the elevation values by when calculating illumination. This can be used either to correct for differences in diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 9e46fefcbd3e..5a681d156162 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -848,7 +848,7 @@ def validate_animation_writer_path(p): # line props 'lines.linewidth': [2.5, validate_float], # line width in points 'lines.linestyle': ['-', six.text_type], # solid line - 'lines.color': ['b', validate_color], # blue + 'lines.color': ['C0', validate_color], # blue 'lines.marker': ['None', six.text_type], # black 'lines.markeredgewidth': [1.0, validate_float], 'lines.markersize': [6, validate_float], # markersize, in points @@ -867,7 +867,7 @@ def validate_animation_writer_path(p): ## patch props 'patch.linewidth': [None, validate_float_or_None], # line width in points 'patch.edgecolor': ['k', validate_color], # black - 'patch.facecolor': ['#1f77b4', validate_color], # blue (first color in color cycle) + 'patch.facecolor': ['C0', validate_color], # blue (first color in color cycle) 'patch.antialiased': [True, validate_bool], # antialiased (no jaggies) ## Histogram properties @@ -885,7 +885,7 @@ def validate_animation_writer_path(p): 'boxplot.showfliers': [True, validate_bool], 'boxplot.meanline': [False, validate_bool], - 'boxplot.flierprops.color': ['b', validate_color], + 'boxplot.flierprops.color': ['C0', validate_color], 'boxplot.flierprops.marker': ['+', six.text_type], 'boxplot.flierprops.markerfacecolor': ['auto', validate_color_or_auto], 'boxplot.flierprops.markeredgecolor': ['k', validate_color], @@ -893,11 +893,11 @@ def validate_animation_writer_path(p): 'boxplot.flierprops.linestyle': ['none', six.text_type], 'boxplot.flierprops.linewidth': [1.0, validate_float], - 'boxplot.boxprops.color': ['b', validate_color], + 'boxplot.boxprops.color': ['C0', validate_color], 'boxplot.boxprops.linewidth': [1.0, validate_float], 'boxplot.boxprops.linestyle': ['-', six.text_type], - 'boxplot.whiskerprops.color': ['b', validate_color], + 'boxplot.whiskerprops.color': ['C0', validate_color], 'boxplot.whiskerprops.linewidth': [1.0, validate_float], 'boxplot.whiskerprops.linestyle': ['--', six.text_type], @@ -905,7 +905,7 @@ def validate_animation_writer_path(p): 'boxplot.capprops.linewidth': [1.0, validate_float], 'boxplot.capprops.linestyle': ['-', six.text_type], - 'boxplot.medianprops.color': ['r', validate_color], + 'boxplot.medianprops.color': ['C1', validate_color], 'boxplot.medianprops.linewidth': [1.0, validate_float], 'boxplot.medianprops.linestyle': ['-', six.text_type], @@ -1016,7 +1016,10 @@ def validate_animation_writer_path(p): 'axes.formatter.use_mathtext': [False, validate_bool], 'axes.formatter.useoffset': [True, validate_bool], 'axes.unicode_minus': [True, validate_bool], - 'axes.color_cycle': [['b', 'g', 'r', 'c', 'm', 'y', 'k'], + 'axes.color_cycle': [ + ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', + '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', + '#bcbd22', '#17becf'], deprecate_axes_colorcycle], # cycle of plot # line colors # This entry can be either a cycler object or a diff --git a/lib/matplotlib/sankey.py b/lib/matplotlib/sankey.py index 423884723461..a081cb112d50 100755 --- a/lib/matplotlib/sankey.py +++ b/lib/matplotlib/sankey.py @@ -770,11 +770,15 @@ def _get_angle(a, r): print("lrpath\n", self._revert(lrpath)) xs, ys = list(zip(*vertices)) self.ax.plot(xs, ys, 'go-') - patch = PathPatch(Path(vertices, codes), - fc=kwargs.pop('fc', kwargs.pop('facecolor', - '#bfd1d4')), # Custom defaults - lw=kwargs.pop('lw', kwargs.pop('linewidth', 0.5)), - **kwargs) + if rcParams['_internal.classic_mode']: + fc = kwargs.pop('fc', kwargs.pop('facecolor', '#bfd1d4')) + lw = kwargs.pop('lw', kwargs.pop('linewidth', 0.5)) + else: + fc = kwargs.pop('fc', kwargs.pop('facecolor', None)) + lw = kwargs.pop('lw', kwargs.pop('linewidth', None)) + if fc is None: + fc = six.next(self.ax._get_patches_for_fill.prop_cycler)['color'] + patch = PathPatch(Path(vertices, codes), fc=fc, lw=lw, **kwargs) self.ax.add_patch(patch) # Add the path labels. diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py index 8a34f97c389a..e44885953373 100644 --- a/lib/matplotlib/stackplot.py +++ b/lib/matplotlib/stackplot.py @@ -108,10 +108,7 @@ def stackplot(axes, x, *args, **kwargs): raise ValueError(errstr) # Color between x = 0 and the first array. - if 'color' in axes._get_lines._prop_keys: - color = six.next(axes._get_lines.prop_cycler)['color'] - else: - color = None + color = axes._get_lines.get_next_color() r.append(axes.fill_between(x, first_line, stack[0, :], facecolor=color, label= six.next(labels, None), @@ -120,10 +117,7 @@ def stackplot(axes, x, *args, **kwargs): # Color between array i-1 and array i for i in xrange(len(y) - 1): - if 'color' in axes._get_lines._prop_keys: - color = six.next(axes._get_lines.prop_cycler)['color'] - else: - color = None + color = axes._get_lines.get_next_color() r.append(axes.fill_between(x, stack[i, :], stack[i + 1, :], facecolor=color, label= six.next(labels, None), diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index 64db899104d2..51409fad6828 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -82,8 +82,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, if transform is None: transform = axes.transData - if color is None and 'color' in axes._get_lines._prop_keys: - color = six.next(axes._get_lines.prop_cycler)['color'] + if color is None: + color = axes._get_lines.get_next_color() if linewidth is None: linewidth = matplotlib.rcParams['lines.linewidth'] diff --git a/lib/matplotlib/tests/baseline_images/test_cycles/lineprop_cycle_basic.png b/lib/matplotlib/tests/baseline_images/test_cycles/lineprop_cycle_basic.png index e3706c3216f27cc2bb483b53d0ac894a01b2bbb0..2d20423df44d54c53dcbb0593a83772e92d9d611 100644 GIT binary patch literal 41852 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 z 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 Hy@3A%qY+CK diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 1e2fc5b19829..283c17c6ea4d 100755 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -1593,7 +1593,10 @@ def plot_surface(self, X, Y, Z, *args, **kwargs): if 'facecolors' in kwargs: fcolors = kwargs.pop('facecolors') else: - color = np.array(colorConverter.to_rgba(kwargs.pop('color', 'b'))) + color = kwargs.pop('color', None) + if color is None: + color = self._get_lines.get_next_color() + color = np.array(colorConverter.to_rgba(color)) fcolors = None cmap = kwargs.get('cmap', None) @@ -1862,7 +1865,10 @@ def plot_trisurf(self, *args, **kwargs): had_data = self.has_data() # TODO: Support custom face colours - color = np.array(colorConverter.to_rgba(kwargs.pop('color', 'b'))) + color = kwargs.pop('color', None) + if color is None: + color = self._get_lines.get_next_color() + color = np.array(colorConverter.to_rgba(color)) cmap = kwargs.get('cmap', None) norm = kwargs.pop('norm', None) @@ -2211,7 +2217,7 @@ def add_collection3d(self, col, zs=0, zdir='z'): Axes.add_collection(self, col) - def scatter(self, xs, ys, zs=0, zdir='z', s=20, c='b', depthshade=True, + def scatter(self, xs, ys, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs): ''' Create a scatter plot. @@ -2264,6 +2270,8 @@ def scatter(self, xs, ys, zs=0, zdir='z', s=20, c='b', depthshade=True, s = np.ma.ravel(s) # This doesn't have to match x, y in size. + if c is None: + c = self._get_lines.get_next_color() cstr = cbook.is_string_like(c) or cbook.is_sequence_of_strings(c) if not cstr: c = np.asanyarray(c) @@ -2342,7 +2350,7 @@ def bar(self, left, height, zs=0, zdir='z', *args, **kwargs): return patches - def bar3d(self, x, y, z, dx, dy, dz, color='b', + def bar3d(self, x, y, z, dx, dy, dz, color=None, zsort='average', *args, **kwargs): ''' Generate a 3D bar, or multiple bars. diff --git a/matplotlibrc.template b/matplotlibrc.template index ed220657175d..1ddb3fcd0dd2 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -80,7 +80,7 @@ backend : $TEMPLATE_BACKEND # information on line properties. #lines.linewidth : 2.0 # line width in points #lines.linestyle : - # solid line -#lines.color : blue # has no affect on plot(); see axes.prop_cycle +#lines.color : C0 # has no affect on plot(); see axes.prop_cycle #lines.marker : None # the default marker #lines.markeredgewidth : 1.0 # the line width around the marker symbol #lines.markersize : 6 # markersize, in points @@ -105,7 +105,7 @@ backend : $TEMPLATE_BACKEND #patch.linewidth : None # edge width in points. # If None, use axes.linewidth when patch # is not filled. -#patch.facecolor : 1f77b4 +#patch.facecolor : C0 #patch.edgecolor : black #patch.antialiased : True # render patches in antialiased (no jaggies) @@ -141,14 +141,14 @@ backend : $TEMPLATE_BACKEND #boxplot.capprops.linewidth : 1.0 #boxplot.capprops.linestyle : '-' -#boxplot.medianprops.color : 'b' +#boxplot.medianprops.color : 'C0' #boxplot.medianprops.linewidth : 1.0 #boxplot.medianprops.linestyle : '-' -#boxplot.meanprops.color : 'b' +#boxplot.meanprops.color : 'C1' #boxplot.meanprops.marker : '^' -#boxplot.meanprops.markerfacecolor : 'b' -#boxplot.meanprops.markeredgecolor : 'b' +#boxplot.meanprops.markerfacecolor : 'C1' +#boxplot.meanprops.markeredgecolor : 'C1' #boxplot.meanprops.markersize : 6 #boxplot.meanprops.linestyle : 'none' #boxplot.meanprops.linewidth : 1.0 From 649722afa5c76096f5f6473415d3a5490fefe148 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Apr 2016 18:56:09 -0400 Subject: [PATCH 3/8] Fix number --- examples/pylab_examples/color_demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pylab_examples/color_demo.py b/examples/pylab_examples/color_demo.py index 3ccf07a2e1a2..af632b93b2e2 100755 --- a/examples/pylab_examples/color_demo.py +++ b/examples/pylab_examples/color_demo.py @@ -1,6 +1,6 @@ #!/usr/bin/env python """ -matplotlib gives you 4 ways to specify colors, +matplotlib gives you 5 ways to specify colors, 1) as a single letter string, ala MATLAB From 3427fa7f38b83c7125ea7e1b8b0209794db3942e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Apr 2016 18:57:27 -0400 Subject: [PATCH 4/8] Change color used in example --- examples/pylab_examples/color_demo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/pylab_examples/color_demo.py b/examples/pylab_examples/color_demo.py index af632b93b2e2..f67569ac9f22 100755 --- a/examples/pylab_examples/color_demo.py +++ b/examples/pylab_examples/color_demo.py @@ -23,8 +23,8 @@ #subplot(111, facecolor='#ababab') t = np.arange(0.0, 2.0, 0.01) s = np.sin(2*np.pi*t) -plt.plot(t, s, 'C0') -plt.xlabel('time (s)', color='C0') +plt.plot(t, s, 'C1') +plt.xlabel('time (s)', color='C1') plt.ylabel('voltage (mV)', color='0.5') # grayscale color plt.title('About as silly as it gets, folks', color='#afeeee') plt.show() From 992a258b78bda11f7db653117dff3d165cf36bf3 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Apr 2016 18:58:04 -0400 Subject: [PATCH 5/8] Fix typo --- lib/matplotlib/colors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index a7349dcd55a4..c3555585838a 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -74,7 +74,7 @@ def is_color_like(c): 'Return *True* if *c* can be converted to *RGB*' - # Special-case the N-th color cycle syntax, because it's parsing + # Special-case the N-th color cycle syntax, because its parsing # needs to be deferred. We may be reading a value from rcParams # here before the color_cycle rcParam has been parsed. if isinstance(c, bytes): From 5626c401e0b0bb358229ceada324280de418241e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Apr 2016 21:15:34 -0400 Subject: [PATCH 6/8] PEP8 --- lib/matplotlib/axes/_axes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 184186fe738d..0671a1a34385 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2572,6 +2572,7 @@ def pie(self, x, explode=None, labels=None, colors=None, get_next_color = self._get_patches_for_fill.get_next_color else: color_cycle = itertools.cycle(colors) + def get_next_color(): return six.next(color_cycle) From 17b71ea922c490e39e0cca7b1c3c3e64d1bd8edf Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Apr 2016 21:16:28 -0400 Subject: [PATCH 7/8] Fix Sankey example --- lib/matplotlib/sankey.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/sankey.py b/lib/matplotlib/sankey.py index a081cb112d50..41d3e04a308d 100755 --- a/lib/matplotlib/sankey.py +++ b/lib/matplotlib/sankey.py @@ -45,6 +45,7 @@ from matplotlib.transforms import Affine2D from matplotlib import verbose from matplotlib import docstring +from matplotlib import rcParams __author__ = "Kevin L. Davies" __credits__ = ["Yannick Copin"] From 58e66c820b036389510400af7f52338d05f08908 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 26 Apr 2016 10:15:59 -0400 Subject: [PATCH 8/8] Fix comments --- lib/matplotlib/rcsetup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 5a681d156162..6f34c402499e 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -848,7 +848,7 @@ def validate_animation_writer_path(p): # line props 'lines.linewidth': [2.5, validate_float], # line width in points 'lines.linestyle': ['-', six.text_type], # solid line - 'lines.color': ['C0', validate_color], # blue + 'lines.color': ['C0', validate_color], # first color in color cycle 'lines.marker': ['None', six.text_type], # black 'lines.markeredgewidth': [1.0, validate_float], 'lines.markersize': [6, validate_float], # markersize, in points @@ -867,7 +867,7 @@ def validate_animation_writer_path(p): ## patch props 'patch.linewidth': [None, validate_float_or_None], # line width in points 'patch.edgecolor': ['k', validate_color], # black - 'patch.facecolor': ['C0', validate_color], # blue (first color in color cycle) + 'patch.facecolor': ['C0', validate_color], # first color in color cycle 'patch.antialiased': [True, validate_bool], # antialiased (no jaggies) ## Histogram properties