Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Request: support animation/live updating of OHLCV data plots. #25

Closed
andresberejnoi opened this issue Feb 4, 2020 · 28 comments
Closed
Labels
enhancement New feature or request

Comments

@andresberejnoi
Copy link

Is your feature request related to a problem? Please describe.
I am trying to rewrite a live chart plotting function I had with the previous mpl-finance module by using matplotlib animation.FuncAnimation method (documentation here).

The function expects to be passed a figure where to draw. For the func argument, I am passing a simple function animate_plot:

class Plotter(object):
...
    def plot_live_chart(self,ohlc_data):
        def animate_plot(df_generator, *fargs):
            _type = fargs[0]
            mplfinance.plot(df_generator,type=_type)
     
        fig = plt.figure()
        ax1 = fig.add_subplot(1,1,1)
        #ani = animation.FuncAnimation(fig,animate_plot,interval=self.plot_refresh_rate,blit=True) #blit=True means to only re-draw parts that have changed
        ani = animation.FuncAnimation(fig,animate_plot,frames=ohlc_data.iterrows(),fargs=(self.type,),interval=self.plot_refresh_rate)

When I run my code, I only get a blank canvas at the end. I am thinking that it could be because on each call to mplfinance.plot a new figure is created but I am not really sure.
Describe the solution you'd like
I would like to have another parameter option for mplfinance.plot to provide a previously created figure. Then it could be checked internally to see if the parameter was provided then that figure is used. If not, then the normal code creates one.

I think it could also be useful to have the function return the figure so it can still be used later. If these are things that are already possible then could you point me in the right direction where to find it?

Describe alternatives you've considered
I think it would be great if a live plotter method were implemented with mplfinance so there is no need to build around it.
It could be a method that uses the already existing .plot() similar to what I am doing above but better. This method could either animate a full dataframe like historical data and it could also animate continuously updating data.

I think this fits better for another feature request. I may open one soon once I have more time to think of how it could be implemented.

@andresberejnoi andresberejnoi added the enhancement New feature or request label Feb 4, 2020
@DanielGoldfarb
Copy link
Collaborator

I am planning the ability to pass existing Axes into mpf.plot(), and hope to start work on that feature later this week. I am not very familiar with animating plots (only experimented with it once) so I'm not really sure if passing the axes will do what you want. I am also considering having mplfinance return the figure and axes that it creates.

Ideally, if you could point me to, or send to me, a working version of your existing animated plot code, along with some data to test it, that would help very much for me to better understand "live plotting," as well as your specific use-case; then perhaps we can come up with a way to integrate live plotting into mplfinance

@andresberejnoi
Copy link
Author

andresberejnoi commented Feb 5, 2020

Thank you for the reply. I will look at my code and try to extract that portion to show. Since it is part of a bigger project and class I will have to make sure nothing breaks in the example. Should I post it right here?

@DanielGoldfarb
Copy link
Collaborator

You can post it here, but perhaps it's easier to create a gist or public repo (that can be cloned) under your github account and post a link here to it. Thanks.

@andresberejnoi
Copy link
Author

andresberejnoi commented Feb 5, 2020 via email

@DanielGoldfarb
Copy link
Collaborator

@andresberejnoi --
Thanks. This is very helpful. In the middle of a big project right now. Will get back to reviewing this in a few weeks. I definitely like the idea of mplfinance supporting live candlesticks.

@andresberejnoi
Copy link
Author

Thank you. It would be a very useful feature. I will also keep looking into it when I get the time.

@DanielGoldfarb DanielGoldfarb changed the title Feature Reuest: Allow mplfinance.plot to Receive Figure as Argument Feature Reuest: support animation/live updating of OHLCV data Feb 12, 2020
@DanielGoldfarb
Copy link
Collaborator

I've modified the title because I think the main idea here is to support live updating of the plot, not necessarily via passing in the Figure (although that may be one possible solution). Please let me know if this is correct.

@DanielGoldfarb DanielGoldfarb changed the title Feature Reuest: support animation/live updating of OHLCV data Feature Reuest: support animation/live updating of OHLCV data plots. Feb 12, 2020
@andresberejnoi
Copy link
Author

andresberejnoi commented Feb 12, 2020 via email

@DanielGoldfarb
Copy link
Collaborator

If desired, can you please describe, in some detail, one or two use-cases for passing in the Figure. The problem is this: I am experimenting with a possible enhancement to allow you to pass in Axes (not Figure), and mplfinance will plot on those Axes, thus allowing the user to configure any number of SubPlot.Axes within a Figure, and plot on them ... however if you pass in Figure, mplfinance doesn't know what to do with it! Does it create the Axes it needs, using the Figure passed in (as it does now for it's own internal Figure)? If so, how much of the Figure should it take up with those Axes? Part of it? All of it? Or does it query the Figure passed in to find out if there are already Axes on it? If so, which of those Axes should it use?

@andresberejnoi
Copy link
Author

It seems that passing axes is better. To be honest, I am very inexperienced with matplotlib so I thought figures are usually passed around.

@DanielGoldfarb
Copy link
Collaborator

Ok. Noted. Yes, the matplotlib standard is to pass axes. Thanks.

@DanielGoldfarb DanielGoldfarb changed the title Feature Reuest: support animation/live updating of OHLCV data plots. Feature Request: support animation/live updating of OHLCV data plots. Mar 18, 2020
@toksis
Copy link

toksis commented May 18, 2020

Is this live now? I also want this live plotting. thanks.

@LennardGVBM
Copy link

Me, too. Would be a great feature!! Thanks

@DanielGoldfarb
Copy link
Collaborator

Support for animation/live-updating will be at least another month or two from now.

There are several other more basic enhancments that I want to release first (including, but not limited to, multiple sublpots, fill_between, tight_layout, and fixing several bugs that have been reported, just to mention a few of things being worked on presently). Rest assured, support for animation/live-updating will come.

@LennardGVBM
Copy link

Wow, you're really quick in replying. Thanks a lot and of cause this is fine. I'm grateful for your effort!

@ddm-j
Copy link

ddm-j commented Jul 4, 2020

Excited to have this feature - it will greatly simplify my work!

@frozenranger
Copy link

Yes can't wait! thanks for everything you do :)

@twopirllc
Copy link

Looking forward to this feature as well. I also have some experimental code somewhere, but not near as thought out as @andresberejnoi has shared.

Thank you

@Blaxxun1999
Copy link

I appreciate all the hard work you've been putting into this project.
Looking forward to new animation and fill capabilities.

@m-kypr
Copy link

m-kypr commented Jul 29, 2020

Also waiting for this feature :)
Keep up the amazing work! 👍

@DanielGoldfarb
Copy link
Collaborator

Animation is now supported in mplfinance.

@frozenranger
Copy link

Yessss Daniel!!!!!! Ty

@andresberejnoi
Copy link
Author

Thank you for your work. This feature will be very handy.

@Blaxxun1999
Copy link

Blaxxun1999 commented Aug 10, 2020 via email

@DanielGoldfarb
Copy link
Collaborator

By the way, I know a lot of people were really looking forward to this feature (along with the feature to be able to pass in external Axes). I would love to see what creative things you do with it, and perhaps include some of them in the examples folder in this repository for others to see and learn what you can do.

Please feel free to attach examples here, and/or submit a PR with one or more examples, and/or email me at [email protected] --- Very much appreciated! Thank you. --Daniel

@manuelwithbmw
Copy link

Animation is now supported in mplfinance.

Sorry, how can I clone the repository again? Never really done it, I'd like to test this feature. Thank you Daniel

@DanielGoldfarb
Copy link
Collaborator

@manuelwithbmw
Depending what you want to accomplish:

  • If you want to just install the latest version (that supports animation):
    • pip install --upgrade mplfinance
  • If you have a cloned repository and you want to update your repository with the latest code:

    I will assume the repository was cloned from your own fork which is the typical case. (if otherwise, let me know).
    You will need to set an upstream remote and pull the latest code from there:
    We assume you are on branch master in your local repository:

    • git remote -v # shows all remotes; if no upstream remote it will look similar to to this:
      dino@DINO:~/code/mplfinance$ git remote -v
      origin [email protected]:DanielGoldfarb/mplfinance.git (fetch)
      origin [email protected]:DanielGoldfarb/mplfinance.git (push)

    • git remote add upstream [email protected]:matplotlib/mplfinance.git
      dino@DINO:~/code/mplfinance$ git remote add upstream [email protected]:matplotlib/mplfinance.git

    • git remote -v # now shows two remotes: origin and upstream; should look similar to to this:
      dino@DINO:~/code/mplfinance$ git remote -v
      origin [email protected]:DanielGoldfarb/mplfinance.git (fetch)
      origin [email protected]:DanielGoldfarb/mplfinance.git (push)
      upstream [email protected]:matplotlib/mplfinance.git (fetch)
      upstream [email protected]:matplotlib/mplfinance.git (push)

    • notice, above, there are now two different remotes: origin, and upstream,
      corresponding to your fork (origin), and to the repository from which it was forked (upstream)

    • Now you can pull the most recent code from the upstream repository, and use it to update your fork.
      (Hopefully there are no changes that would make merging difficult; if there are, you may need to manually merge; if so, and it is not obvious what to do, feel free to contact me for help ([email protected]))

      • git pull upstream master # this will merge upstream into your local repository
      • git push # this will push the merged changes from your local repository to your fork
    • At this point, both your fork and your local clone should be fully in synch with the "production" repository, with all the latest changes.

    • These same instructions, in a more general way, can be found here:
      https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork

HTH. All the best. --Daniel

@manuelwithbmw
Copy link

Great explanation, thank you (I made it after a long time)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

10 participants