@@ -3125,23 +3125,23 @@ def draw(self, renderer):
3125
3125
3126
3126
if (rasterization_zorder is not None and
3127
3127
artists and artists [0 ].zorder < rasterization_zorder ):
3128
- renderer .start_rasterizing ()
3129
- artists_rasterized = [a for a in artists
3130
- if a .zorder < rasterization_zorder ]
3131
- artists = [a for a in artists
3132
- if a .zorder >= rasterization_zorder ]
3128
+ split_index = np .searchsorted (
3129
+ [art .zorder for art in artists ],
3130
+ rasterization_zorder , side = 'right'
3131
+ )
3132
+ artists_rasterized = artists [:split_index ]
3133
+ artists = artists [split_index :]
3133
3134
else :
3134
3135
artists_rasterized = []
3135
3136
3136
- # the patch draws the background rectangle -- the frame below
3137
- # will draw the edges
3138
3137
if self .axison and self ._frameon :
3139
- self .patch .draw (renderer )
3138
+ if artists_rasterized :
3139
+ artists_rasterized = [self .patch ] + artists_rasterized
3140
+ else :
3141
+ artists = [self .patch ] + artists
3140
3142
3141
3143
if artists_rasterized :
3142
- for a in artists_rasterized :
3143
- a .draw (renderer )
3144
- renderer .stop_rasterizing ()
3144
+ _draw_rasterized (self .figure , artists_rasterized , renderer )
3145
3145
3146
3146
mimage ._draw_list_compositing_images (
3147
3147
renderer , self , artists , self .figure .suppressComposite )
@@ -4634,3 +4634,60 @@ def _label_outer_yaxis(self, *, check_patch):
4634
4634
self .yaxis .set_tick_params (which = "both" , labelright = False )
4635
4635
if self .yaxis .offsetText .get_position ()[0 ] == 1 :
4636
4636
self .yaxis .offsetText .set_visible (False )
4637
+
4638
+
4639
+ def _draw_rasterized (figure , artists , renderer ):
4640
+ """
4641
+ A helper function for rasterizing the list of artists.
4642
+
4643
+ The bookkeeping to track if we are or are not in rasterizing mode
4644
+ with the mixed-mode backends is relatively complicated and is now
4645
+ handled in the matplotlib.artist.allow_rasterization decorator.
4646
+
4647
+ This helper defines the absolute minimum methods and attributes on a
4648
+ shim class to be compatible with that decorator and then uses it to
4649
+ rasterize the list of artists.
4650
+
4651
+ This is maybe too-clever, but allows us to re-use the same code that is
4652
+ used on normal artists to participate in the "are we rasterizing"
4653
+ accounting.
4654
+
4655
+ Please do not use this outside of the "rasterize below a given zorder"
4656
+ functionality of Axes.
4657
+
4658
+ Parameters
4659
+ ----------
4660
+ figure : matplotlib.figure.Figure
4661
+ The figure all of the artists belong to (not checked). We need this
4662
+ because we can at the figure level suppress composition and insert each
4663
+ rasterized artist as its own image.
4664
+
4665
+ artists : List[matplotlib.artist.Artist]
4666
+ The list of Artists to be rasterized. These are assumed to all
4667
+ be in the same Figure.
4668
+
4669
+ renderer : matplotlib.backendbases.RendererBase
4670
+ The currently active renderer
4671
+
4672
+ Returns
4673
+ -------
4674
+ None
4675
+
4676
+ """
4677
+ class _MinimalArtist :
4678
+ def get_rasterized (self ):
4679
+ return True
4680
+
4681
+ def get_agg_filter (self ):
4682
+ return None
4683
+
4684
+ def __init__ (self , figure , artists ):
4685
+ self .figure = figure
4686
+ self .artists = artists
4687
+
4688
+ @martist .allow_rasterization
4689
+ def draw (self , renderer ):
4690
+ for a in self .artists :
4691
+ a .draw (renderer )
4692
+
4693
+ return _MinimalArtist (figure , artists ).draw (renderer )
0 commit comments