10000 Add support for match_original patch drawing · matplotlib/matplotlib@a563671 · GitHub
[go: up one dir, main page]

Skip to content

Commit a563671

Browse files
committed
Add support for match_original patch drawing
1 parent eba3d76 commit a563671

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

lib/matplotlib/collections.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -423,13 +423,31 @@ def draw(self, renderer):
423423
self._antialiaseds, self._urls,
424424
"screen")
425425

426-
renderer.draw_path_collection(
427-
gc, transform.frozen(), paths,
428-
self.get_transforms(), offsets, offset_trf,
429-
self.get_facecolor(), self.get_edgecolor(),
430-
self._linewidths, self._linestyles,
431-
self._antialiaseds, self._urls,
432-
"screen") # offset_position, kept for backcompat.
426+
fcolor = itertools.cycle(facecolors) if facecolors.any() \
427+
else itertools.repeat([])
428+
ecolor = itertools.cycle(edgecolors) if edgecolors.any() \
429+
else itertools.repeat([])
430+
lwidth = itertools.cycle(self._linewidths)
431+
lstyle = itertools.cycle(self._linestyles)
432+
antialiased = itertools.cycle(self._antialiaseds)
433+
434+
if self._match_original:
435+
for idx in range(len(paths)):
436+
gc.set_hatch(self._hatch[idx])
437+
renderer.draw_path_collection(
438+
gc, transform.frozen(), [paths[idx]],
439+
self.get_transforms(), offsets, offset_trf,
440+
[next(fcolor)], [next(ecolor)], [next(lwidth)], [next(lstyle)],
441+
[next(antialiased)], self._urls,
442+
"screen") # offset_position, kept for backcompat.
443+
else:
444+
renderer.draw_path_collection(
445+
gc, transform.frozen(), paths,
446+
self.get_transforms(), offsets, offset_trf,
447+
self.get_facecolor(), self.get_edgecolor(),
448+
self._linewidths, self._linestyles,
449+
self._antialiaseds, self._urls,
450+
"screen")
433451

434452
gc.restore()
435453
renderer.close_group(self.__class__.__name__)
@@ -1868,22 +1886,21 @@ def __init__(self, patches, *, match_original=False, **kwargs):
18681886
a call to `~.ScalarMappable.set_array`), at draw time a call to scalar
18691887
mappable will be made to set the face colors.
18701888
"""
1889+
self._match_original = False
18711890

18721891
if match_original:
1892+
self._match_original = True
18731893
kwargs['facecolors'] = [p.get_facecolor() for p in patches]
18741894
kwargs['linewidths'] = [p.get_linewidth() for p in patches]
18751895
kwargs['linestyles'] = [p.get_linestyle() for p in patches]
18761896
kwargs['antialiaseds'] = [p.get_antialiased() for p in patches]
1897+
kwargs['hatch'] = [p.get_hatch() for p in patches]
18771898

18781899
# Edgecolors are handled separately because are defaulted to None
18791900
# and the Hatch colors depend on them.
1880-
if any(p._original_edgecolor is not None for p in patches):
1901+
if all(p._original_edgecolor is not None for p in patches):
18811902
kwargs["edgecolors"] = [p.get_edgecolor() for p in patches]
18821903

1883-
# Using the hatch of only the first patch
1884-
if patches:
1885-
kwargs['hatch'] = patches[0].get_hatch()
1886-
18871904
super().__init__(**kwargs)
18881905

18891906
self.set_paths(patches)

lib/matplotlib/hatch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def __init__(self, hatch, density):
180180

181181

182182
def _validate_hatch_pattern(hatch):
183-
valid_hatch_patterns = set(r'-+|/\xXoO.*')
183+
valid_hatch_patterns = set(r'-+|/\xXoO.*').union({None})
184184
if hatch is not None:
185185
invalids = set(hatch).difference(valid_hatch_patterns)
186186
if invalids:

0 commit comments

Comments
 (0)
0