Save cerebro plot to file
-
Dear community,
I am trying to save to cerebro output plot as a file with the following line of code:
cerebro.plot(volume=False, savefig=True, figfilename='backtrader-plot.png')
Unfortunately that doesn't work... Does anyone know how I can fix that?
Your help would be highly appreciated!
Thanks,
J -
I got the similar problem, I can't change plot size and save picture either. Thus I just rewrite the function in the cerebro.py file. This is my code, I hope this can give you some help.
def plot(self, plotter=None, numfigs=1, iplot=True, start=None, end=None, width=16, height=9, dpi=300, tight=True, use=None,path = None, **kwargs): ''' Plots the strategies inside cerebro If ``plotter`` is None a default ``Plot`` instance is created and ``kwargs`` are passed to it during instantiation. ``numfigs`` split the plot in the indicated number of charts reducing chart density if wished ``iplot``: if ``True`` and running in a ``notebook`` the charts will be displayed inline ``use``: set it to the name of the desired matplotlib backend. It will take precedence over ``iplot`` ``start``: An index to the datetime line array of the strategy or a ``datetime.date``, ``datetime.datetime`` instance indicating the start of the plot ``end``: An index to the datetime line array of the strategy or a ``datetime.date``, ``datetime.datetime`` instance indicating the end of the plot ``width``: in inches of the saved figure ``height``: in inches of the saved figure ``dpi``: quality in dots per inches of the saved figure ``tight``: only save actual content and not the frame of the figure ''' if self._exactbars > 0: return if not plotter: from . import plot if self.p.oldsync: plotter = plot.Plot_OldSync(**kwargs) else: plotter = plot.Plot(**kwargs) # pfillers = {self.datas[i]: self._plotfillers[i] # for i, x in enumerate(self._plotfillers)} # pfillers2 = {self.datas[i]: self._plotfillers2[i] # for i, x in enumerate(self._plotfillers2)} import matplotlib.pyplot as plt figs = [] for stratlist in self.runstrats: for si, strat in enumerate(stratlist): rfig = plotter.plot(strat, figid=si * 100, numfigs=numfigs, iplot=iplot, start=start, end=end, use=use) # pfillers=pfillers2) figs.append(rfig) fig = plt.gcf() plotter.show() fig.set_size_inches(width, height) fig.savefig(path,dpi = dpi) return figs
-
Hi Bingchen,
Thanks for providing your code, this excellent workaround is very helpful indeed!
I was hoping for a more direct implementation where I could just specify the "savefig" within my code, and not messing with the original function. But it seems that this is not (yet) possible within backtrader...
Cheers,
JF -
Hi JF,
You are welcome. I'm glad that my code can give you some ideas. You can see from the code in the source file cerebro.py that although multiple input variables are given for plot function, some of them are not used in the plot function at all ==|||. Thus I guess that the plot function only give you some basic frames on these functions and you have to define by yourself if you want some specific ideas. For more about the plot, you can see doc for matplotlib.pyplot.
Cheers,
Bingchen -
Ok great, thanks! On my search I also came across this website, where the author shows how he creates nice backtrader performance reports in PDF format. It is not exactly what I was looking for, but helped me a lot on the way. You can find the code / template files on github.
Best,
Jascha -
I'm glad my reply can help and thank you for your sharing !
Best,
Bingchen -
@jf said in Save cerebro plot to file:
Ok great, thanks! On my search I also came across this website, where the author shows how he creates nice backtrader performance reports in PDF format. It is not exactly what I was looking for, but helped me a lot on the way. You can find the code / template files on github.
Best,
Jaschavery cool! thanks!
-
I don't know the reason savefig have been removed at https://github.com/backtrader/backtrader/commit/f6e7c6dfb4151c7d5d554e2bce5a2ced8daa85c5 commit.
For saving the figure i just do this:
figure = cerebro.plot(style ='candlebars')[0][0]
figure.savefig('example.png') -
@marticols I'm getting this error while trying to save the plot by the method mentioned by you:
can't invoke "wm" command: application has been destroyedCan you provide any help?