@@ -200,11 +200,10 @@ def example_plot(ax, fontsize=12, nodec=False):
200
200
#############################################
201
201
# However, this will steal space from a subplot layout:
202
202
203
- fig , axs = plt .subplots (2 , 2 , constrained_layout = True )
204
- for ax in axs .flatten ()[:- 1 ]:
205
- ax .plot (np .arange (10 ))
206
- axs [1 , 1 ].plot (np .arange (10 ), label = 'This is a plot' )
207
- axs [1 , 1 ].legend (loc = 'center left' , bbox_to_anchor = (0.8 , 0.5 ))
203
+ fig , axs = plt .subplots (1 , 2 , figsize = (4 , 2 ), constrained_layout = True )
204
+ axs [0 ].plot (np .arange (10 ))
205
+ axs [1 ].plot (np .arange (10 ), label = 'This is a plot' )
206
+ axs [1 ].legend (loc = 'center left' , bbox_to_anchor = (0.8 , 0.5 ))
208
207
209
208
#############################################
210
209
# In order for a legend or other artist to *not* steal space
@@ -213,30 +212,47 @@ def example_plot(ax, fontsize=12, nodec=False):
213
212
# cropped, but can be useful if the plot is subsequently called
214
213
# with ``fig.savefig('outname.png', bbox_inches='tight')``. Note,
215
214
# however, that the legend's ``get_in_layout`` status will have to be
216
- # toggled again to make the saved file work:
215
+ # toggled again to make the saved file work, and we must manually
216
+ # trigger a draw if we want constrained_layout to adjust the size
217
+ # of the axes before printing.
217
218
218
- fig , axs = plt .subplots (2 , 2 , constrained_layout = True )
219
- for ax in axs . flatten ()[: - 1 ]:
220
- ax .plot (np .arange (10 ))
221
- axs [1 , 1 ].plot (np .arange (10 ), label = 'This is a plot' )
222
- leg = axs [1 , 1 ].legend (loc = 'center left' , bbox_to_anchor = (0.8 , 0.5 ))
219
+ fig , axs = plt .subplots (1 , 2 , figsize = ( 4 , 2 ) , constrained_layout = True )
220
+
221
+ axs [ 0 ] .plot (np .arange (10 ))
222
+ axs [1 ].plot (np .arange (10 ), label = 'This is a plot' )
223
+ leg = axs [1 ].legend (loc = 'center left' , bbox_to_anchor = (0.8 , 0.5 ))
223
224
leg .set_in_layout (False )
224
- wanttoprint = False
225
- if wanttoprint :
226
- leg .set_in_layout (True )
227
- fig .do_constrained_layout (False )
228
- fig .savefig ('outname.png' , bbox_inches = 'tight' )
225
+ # trigger a draw so that constrained_layout is executed once
226
+ # before we turn it off when printing....
227
+ fig .canvas .draw ()
228
+ # we want the legend included in the bbox_inches='tight' calcs.
229
+ leg .set_in_layout (True )
230
+ # we don't want the layout to change at this point.
231
+ fig .set_constrained_layout (False )
232
+ fig .savefig ('CL01.png' , bbox_inches = 'tight' , dpi = 100 )
229
233
230
234
#############################################
235
+ # The saved file looks like:
236
+ #
237
+ # .. image:: /_static/constrained_layout/CL01.png
238
+ # :align: center
239
+ #
231
240
# A better way to get around this awkwardness is to simply
232
- # use a legend for the figure:
233
- fig , axs = plt .subplots (2 , 2 , constrained_layout = True )
234
- for ax in axs .flatten ()[:- 1 ]:
235
- ax .plot (np .arange (10 ))
236
- lines = axs [1 , 1 ].plot (np .arange (10 ), label = 'This is a plot' )
241
+ # use the legend method provided by `.Figure.legend`:
242
+ fig , axs = plt .subplots (1 , 2 , figsize = (4 , 2 ), constrained_layout = True )
243
+ axs [0 ].plot (np .arange (10 ))
244
+ lines = axs [1 ].plot (np .arange (10 ), label = 'This is a plot' )
237
245
labels = [l .get_label () for l in lines ]
238
246
leg = fig .legend (lines , labels , loc = 'center left' ,
239
- bbox_to_anchor = (0.8 , 0.5 ), bbox_transform = axs [1 , 1 ].transAxes )
247
+ bbox_to_anchor = (0.8 , 0.5 ), bbox_transform = axs [1 ].transAxes )
248
+ fig .savefig ('CL02.png' , bbox_inches = 'tight' , dpi = 100 )
249
+
250
+ #############################################
251
+ # The saved file looks like:
252
+ #
253
+ # .. image:: /_static/constrained_layout/CL02.png
254
+ # :align: center
255
+ #
240
256
241
257
###############################################################################
242
258
# Padding and Spacing
0 commit comments