|
9 | 9 | import math |
10 | 10 | from operator import itemgetter |
11 | 11 |
|
| 12 | +from cycler import cycler |
12 | 13 | import numpy as np |
13 | 14 | from numpy import ma |
14 | 15 |
|
@@ -138,20 +139,25 @@ class _process_plot_var_args(object): |
138 | 139 | def __init__(self, axes, command='plot'): |
139 | 140 | self.axes = axes |
140 | 141 | self.command = command |
141 | | - self.set_color_cycle() |
| 142 | + self.set_style_cycle() |
142 | 143 |
|
143 | 144 | def __getstate__(self): |
144 | 145 | # note: it is not possible to pickle a itertools.cycle instance |
145 | 146 | return {'axes': self.axes, 'command': self.command} |
146 | 147 |
|
147 | 148 | def __setstate__(self, state): |
148 | 149 | self.__dict__ = state.copy() |
149 | | - self.set_color_cycle() |
150 | | - |
151 | | - def set_color_cycle(self, clist=None): |
152 | | - if clist is None: |
153 | | - clist = rcParams['axes.color_cycle'] |
154 | | - self.color_cycle = itertools.cycle(clist) |
| 150 | + self.set_style_cycle() |
| 151 | + |
| 152 | + def set_style_cycle(self, style_cycler=None): |
| 153 | + if style_cycler is None: |
| 154 | + style_cycler = rcParams['axes.style_cycle'] |
| 155 | + if style_cycler is None and 'axes.color_cycle' in rcParams: |
| 156 | + clist = rcParams['axes.color_cycle'] |
| 157 | + style_cycler = cycler('color', clist) |
| 158 | + self.style_cycler = itertools.cycle(style_cycler) |
| 159 | + # Make a copy |
| 160 | + self._style_keys = list(style_cycler.keys) |
155 | 161 |
|
156 | 162 | def __call__(self, *args, **kwargs): |
157 | 163 |
|
@@ -229,24 +235,37 @@ def _xy_from_xy(self, x, y): |
229 | 235 | y = y[:, np.newaxis] |
230 | 236 | return x, y |
231 | 237 |
|
| 238 | + def _setdefaults(self, kw, kwargs): |
| 239 | + # Only advance the cycler if the cycler |
| 240 | + # has information that is not specified |
| 241 | + # in the supplied kw and kwargs dicts |
| 242 | + if any([kw.get(k, None) is None and kwargs.get(k, None) is None |
| 243 | + for k in self._style_keys]): |
| 244 | + default_dict = six.next(self.style_cycler) |
| 245 | + else: |
| 246 | + default_dict = None |
| 247 | + |
| 248 | + for k in self._style_keys: |
| 249 | + if (default_dict is not None and |
| 250 | + kw.get(k, None) is None and |
| 251 | + kwargs.get(k, None) is None): |
| 252 | + kwargs[k] = kw[k] = default_dict[k] |
| 253 | + |
232 | 254 | def _makeline(self, x, y, kw, kwargs): |
233 | 255 | kw = kw.copy() # Don't modify the original kw. |
234 | 256 | kwargs = kwargs.copy() |
235 | | - if kw.get('color', None) is None and kwargs.get('color', None) is None: |
236 | | - kwargs['color'] = kw['color'] = six.next(self.color_cycle) |
237 | | - # (can't use setdefault because it always evaluates |
238 | | - # its second argument) |
239 | | - seg = mlines.Line2D(x, y, |
240 | | - **kw |
241 | | - ) |
| 257 | + self._setdefaults(kw, kwargs) |
| 258 | + seg = mlines.Line2D(x, y, **kw) |
242 | 259 | self.set_lineprops(seg, **kwargs) |
243 | 260 | return seg |
244 | 261 |
|
245 | 262 | def _makefill(self, x, y, kw, kwargs): |
246 | | - try: |
247 | | - facecolor = kw['color'] |
248 | | - except KeyError: |
249 | | - facecolor = six.next(self.color_cycle) |
| 263 | + kw = kw.copy() # Don't modify the original kw. |
| 264 | + kwargs = kwargs.copy() |
| 265 | + # Might be problematic with fallback names such as |
| 266 | + # 'facecolor' and such. Possibly fixed by traitlets? |
| 267 | + self._setdefaults(kw, kwargs) |
| 268 | + facecolor = kw['color'] |
250 | 269 | seg = mpatches.Polygon(np.hstack((x[:, np.newaxis], |
251 | 270 | y[:, np.newaxis])), |
252 | 271 | facecolor=facecolor, |
|
0 commit comments