@@ -215,12 +215,35 @@ def _print_pgfplot_libs_message(data):
215
215
print ('=========================================================' )
216
216
return
217
217
218
+ class _ContentManager (object ):
219
+ """ Basic Content Manager for matplotlib2tikz
220
+
221
+ This manager uses a dictionary to map z-order to an array of content
222
+ to be drawn at the z-order.
223
+ """
224
+ def __init__ (self ):
225
+ self ._content = dict ()
226
+
227
+ def extend (self , content , zorder ):
228
+ """ Extends with a list and a z-order
229
+ """
230
+ if zorder not in self ._content :
231
+ self ._content [zorder ] = []
232
+ self ._content [zorder ].extend (content )
233
+
234
+ def flatten (self ):
235
+ content_out = []
236
+ all_z = sorted (self ._content .keys ())
237
+ for z in all_z :
238
+ content_out .extend (self ._content [z ])
239
+ return content_out
240
+
218
241
219
242
def _recurse (data , obj ):
220
243
'''Iterates over all children of the current object, gathers the contents
221
244
contributing to the resulting PGFPlots file, and returns those.
222
245
'''
223
- content = []
246
+ content = _ContentManager ()
224
247
for child in obj .get_children ():
225
248
if isinstance (child , mpl .axes .Axes ):
226
249
# Reset 'extra axis options' for every new Axes environment.
@@ -234,34 +257,35 @@ def _recurse(data, obj):
234
257
if data ['extra axis options' ]:
235
258
ax .axis_options .extend (data ['extra axis options' ])
236
259
# populate content
237
- content .extend (ax .get_begin_code ())
238
- content .extend (children_content )
239
- content .extend (ax .get_end_code (data ))
260
+ content .extend (
261
+ ax .get_begin_code () +
262
+ children_content +
263
+ [ax .get_end_code (data )], 0 )
240
264
elif isinstance (child , mpl .lines .Line2D ):
241
265
data , cont = line2d .draw_line2d (data , child )
242
- content .extend (cont )
266
+ content .extend (cont , child . get_zorder () )
243
267
elif isinstance (child , mpl .image .AxesImage ):
244
268
data , cont = img .draw_image (data , child )
245
- content .extend (cont )
269
+ content .extend (cont , child . get_zorder () )
246
270
# # Really necessary?
247
271
# data, children_content = _recurse(data, child)
248
272
# content.extend(children_content)
249
273
elif isinstance (child , mpl .patches .Patch ):
250
274
data , cont = patch .draw_patch (data , child )
251
- content .extend (cont )
275
+ content .extend (cont , child . get_zorder () )
252
276
elif isinstance (child , mpl .collections .PatchCollection ) or \
253
277
isinstance (child , mpl .collections .PolyCollection ):
254
278
data , cont = patch .draw_patchcollection (data , child )
255
- content .extend (cont )
279
+ content .extend (cont , child . get_zorder () )
256
280
elif isinstance (child , mpl .collections .PathCollection ):
257
281
data , cont = path .draw_pathcollection (data , child )
258
- content .extend (cont )
282
+ content .extend (cont , child . get_zorder () )
259
283
elif isinstance (child , mpl .collections .LineCollection ):
260
284
data , cont = line2d .draw_linecollection (data , child )
261
- content .extend (cont )
285
+ content .extend (cont , child . get_zorder () )
262
286
elif isinstance (child , mpl .collections .QuadMesh ):
263
287
data , cont = qmsh .draw_quadmesh (data , child )
264
- content .extend (cont )
288
+ content .extend (cont , child . get_zorder () )
265
289
elif isinstance (child , mpl .legend .Legend ):
266
290
data = legend .draw_legend (data , child )
267
291
elif isinstance (child , mpl .axis .XAxis ) or \
@@ -276,5 +300,5 @@ def _recurse(data, obj):
276
300
if isinstance (obj , mpl .axes .Subplot ) or isinstance (obj , mpl .figure .Figure ):
277
301
for text in obj .texts :
278
302
data , cont = mytext .draw_text (data , text )
279
- content .extend (cont )
280
- return data , content
303
+ content .extend (cont , text . get_zorder () )
304
+ return data , content . flatten ()
0 commit comments