Minimal Example
import pandas as pd import plotnine df = pd.DataFrame(patsy.demo_data("a",'b','x','y', 'z')) p = plotnine.ggplot(df) p += plotnine.geom_point(plotnine.aes('x','y')) p += plotnine.facet_wrap('b') p += plotnine.theme_xkcd() p.save('test.png') # succeeds p.save('test2.png', dpi=72) # fails
fails with the following stack trace:
/martha/ffs/e/plotnine_exploration/code3/plotnine/plotnine/ggplot.py in save(self, filename, format, path, width, height, units, dpi, limitsize, verbose, **kwargs) 726 except Exception as err: 727 figure[0] and plt.close(figure[0]) --> 728 raise err 729 else: 730 figure[0] and plt.close(figure[0]) /martha/ffs/e/plotnine_exploration/code3/plotnine/plotnine/ggplot.py in save(self, filename, format, path, width, height, units, dpi, limitsize, verbose, **kwargs) 723 724 try: --> 725 _save() 726 except Exception as err: 727 figure[0] and plt.close(figure[0]) /martha/ffs/e/plotnine_exploration/code3/plotnine/plotnine/ggplot.py in _save() 720 fig_kwargs['frameon'] = True 721 --> 722 fig.savefig(filename, **fig_kwargs) 723 724 try: /usr/local/lib/python3.6/dist-packages/matplotlib/figure.py in savefig(self, fname, **kwargs) 2033 self.set_frameon(frameon) 2034 -> 2035 self.canvas.print_figure(fname, **kwargs) 2036 2037 if frameon: /usr/local/lib/python3.6/dist-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs) 2210 orientation=orientation, 2211 dryrun=True, -> 2212 **kwargs) 2213 renderer = self.figure._cachedRenderer 2214 bbox_inches = self.figure.get_tightbbox(renderer) /usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py in print_png(self, filename_or_obj, *args, **kwargs) 511 512 def print_png(self, filename_or_obj, *args, **kwargs): --> 513 FigureCanvasAgg.draw(self) 514 renderer = self.get_renderer() 515 original_dpi = renderer.dpi /usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py in draw(self) 431 # if toolbar: 432 # toolbar.set_cursor(cursors.WAIT) --> 433 self.figure.draw(self.renderer) 434 # A GUI class may be need to update a window using this draw, so 435 # don't forget to call the superclass. /usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 53 renderer.start_filter() 54 ---> 55 return draw(artist, renderer, *args, **kwargs) 56 finally: 57 if artist.get_agg_filter() is not None: /usr/local/lib/python3.6/dist-packages/matplotlib/figure.py in draw(self, renderer) 1470 1471 if self.frameon: -> 1472 self.patch.draw(renderer) 1473 1474 mimage._draw_list_compositing_images( /usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 53 renderer.start_filter() 54 ---> 55 return draw(artist, renderer, *args, **kwargs) 56 finally: 57 if artist.get_agg_filter() is not None: /usr/local/lib/python3.6/dist-packages/matplotlib/patches.py in draw(self, renderer) 556 renderer = PathEffectRenderer(self.get_path_effects(), renderer) 557 --> 558 renderer.draw_path(gc, tpath, affine, rgbFace) 559 560 gc.restore() /usr/local/lib/python3.6/dist-packages/matplotlib/patheffects.py in draw_path(self, gc, tpath, affine, rgbFace) 108 for path_effect in self._path_effects: 109 path_effect.draw_path(self._renderer, gc, tpath, affine, --> 110 rgbFace) 111 112 def draw_markers(self, gc, marker_path, marker_trans, path, *args, /usr/local/lib/python3.6/dist-packages/matplotlib/patheffects.py in draw_path(self, renderer, gc, tpath, affine, rgbFace) 209 """ 210 def draw_path(self, renderer, gc, tpath, affine, rgbFace): --> 211 Stroke.draw_path(self, renderer, gc, tpath, affine, rgbFace) 212 renderer.draw_path(gc, tpath, affine, rgbFace) 213 /usr/local/lib/python3.6/dist-packages/matplotlib/patheffects.py in draw_path(self, renderer, gc, tpath, affine, rgbFace) 196 gc0.copy_properties(gc) 197 --> 198 gc0 = self._update_gc(gc0, self._gc) 199 trans = self._offset_transform(renderer, affine) 200 renderer.draw_path(gc0, tpath, trans, rgbFace) AttributeError: 'withStroke' object has no attribute '_gc'