A python package for animating plots build on matplotlib.

Overview

Documentation Status

animatplot

A python package for making interactive as well as animated plots with matplotlib.

image image

Requires

Installation

pip install animatplot

or using conda

conda install animatplot -c conda-forge

Documentation

Documentation can be found here

Dev Install

git clone https://github.com/t-makaro/animatplot.git
pip install -e .

This project uses pycodestyle for linting. For testing, pytest is used.

Comments
  • Title block

    Title block

    Closes #11.

    I wanted to understand how this library works a bit better so I had a go at writing a new block - the title block.

    I wrote it using test-driven development so there are some unit tests included too.

    I also grouped your existing comparison tests into a class.

    I tried to use args and kwargs in such a way that any type of format string can be passed, and any kwargs intended for the call to matplotlib.pyplot.ax.set_title() are specified as a separate dictionary.

    Let me know what you think.

    opened by TomNicholas 8
  • blocks.Pcolormesh seems to have different behavior than plt.pcolormesh

    blocks.Pcolormesh seems to have different behavior than plt.pcolormesh

    I am not sure if it is a feature or a bug. When I was playing with the example code:

    import numpy as np
    import matplotlib.pyplot as plt
    import animatplot as amp
    
    
    x = np.linspace(-2, 2, 5)
    y = np.linspace(-2, 2, 5)
    t = np.linspace(0, 2*np.pi, 40)
    
    X, Y, T = np.meshgrid(x, y, t)
    
    Z = np.sin(X*X+Y*Y-T)
    
    block = amp.blocks.Pcolormesh(X[:,:,0], Y[:,:,0], Z, t_axis=2, cmap='RdBu')
    plt.colorbar(block.quad)
    plt.gca().set_aspect('equal')
    
    anim = amp.Animation([block], amp.Timeline(t))
    
    anim.controls()
    plt.show()
    

    I used a very coarse grid 55 instead of the original 5050, so that it is more clear. The data array Z is of size 55 at a certain time step. But the generated animation shows a grid of shape 44. It seems blocks.Pcolormesh use the value in Z as the "node" value in animation, which is different in plt.pcolormesh whereZ value is treated as the "mesh cell" value.

    opened by Xin-yang-Liu 6
  • [Bug] .gif files don't loop

    [Bug] .gif files don't loop

    .gif files created with animatplot only run once through, then stop on the final frame. They do loop properly when running interactively (in a Jupyter notebook) though.

    I'm creating a gif in a jupyter notebook, using %matplotlib notebook. I save the gif, then try to open it using

    ![Ising](ising.gif "ising")
    

    This displays the gif once through, then it stops on the final frame. If I rerun the cell then it just opens a static image of the final frame.

    If I open the .gif file with another program it also stops on the final frame, so I think it's a problem with the created file.

    I've tried explicitly passing repeat=True to FuncAnimation() inside animatplot.Animation, and I've also tried using the imagemagick writer rather than PillowWriter, but the problem persists.

    A reproducible example, which is basically just this example):

    %matplotlib notebook
    import numpy as np
    import matplotlib.pyplot as plt
    import animatplot as amp
    
    # Define LxL matrix
    L = 55
    # Initialize as random spin
    M = 2*(np.random.rand(L,L)>.5)-1
    J = 1
    b = 2.5
    
    nPer = 100
    
    images = [M]
    for i in range(100):
        M = M.copy()
        for dm in range(nPer):
            jj = int(np.random.rand()*L - 1)
            kk = int(np.random.rand()*L - 1)
            dE = 2*J*(M[jj+1,kk] + M[jj-1,kk] + M[jj,kk+1] + M[jj,kk-1])*M[jj,kk]
            if dE <= 0:
                M[jj,kk]*=-1
            else:
                if(np.random.rand()<np.exp(-b*dE)):
                    M[jj,kk]*=-1
        images.append(M)
        M[:,-1] = M[:,0]
        M[-1,:] = M[0,:]
    
    fig1, ax1 = plt.subplots()
    
    block = amp.blocks.Imshow(images, axis=ax1)
    anim = amp.Animation([block])
    
    anim.controls()
    anim.save_gif('ising')
    
    ![Ising](ising.gif "ising")
    

    Also the output of using conda list to see which versions of everything I'm using:

    # Name                    Version                   Build
    alabaster                 0.7.12                   py36_0  
    anaconda                  custom           py36hbbc8b67_0  
    anaconda-client           1.7.2                    py36_0  
    anaconda-project          0.8.2                    py36_0  
    animatplot                0.4.0.dev1                <pip>
    appdirs                   1.4.3            py36h28b3542_0  
    asn1crypto                0.24.0                   py36_0  
    astroid                   2.0.4                    py36_0  
    astropy                   3.0.5            py36h7b6447c_0  
    atomicwrites              1.2.1                    py36_0  
    attrs                     18.2.0           py36h28b3542_0  
    automat                   0.7.0                    py36_0  
    babel                     2.6.0                    py36_0  
    backcall                  0.1.0                    py36_0  
    backports                 1.0                      py36_1  
    backports.os              0.1.1                    py36_0  
    backports.shutil_get_terminal_size 1.0.0                    py36_2  
    beautifulsoup4            4.6.3                    py36_0  
    bitarray                  0.8.3            py36h14c3975_0  
    bkcharts                  0.2                      py36_0  
    blas                      1.0                         mkl  
    blaze                     0.11.3                   py36_0  
    bleach                    3.0.2                    py36_0  
    blosc                     1.14.4               hdbcaa40_0  
    bokeh                     1.0.1                    py36_0  
    boto                      2.49.0                   py36_0  
    bottleneck                1.2.1            py36h035aef0_1  
    bzip2                     1.0.6                h14c3975_5  
    ca-certificates           2018.03.07                    0  
    cairo                     1.14.12              h8948797_3  
    certifi                   2018.10.15               py36_0  
    cffi                      1.11.5           py36he75722e_1  
    cftime                    1.0.2.1          py36hdd07704_0  
    chardet                   3.0.4                    py36_1  
    click                     7.0                      py36_0  
    cloudpickle               0.6.1                    py36_0  
    clyent                    1.2.2                    py36_1  
    colorama                  0.4.0                    py36_0  
    constantly                15.1.0           py36h28b3542_0  
    contextlib2               0.5.5                    py36_0  
    cryptography              2.3.1            py36hc365091_0  
    curl                      7.61.0               h84994c4_0  
    cycler                    0.10.0                   py36_0  
    cython                    0.29             py36he6710b0_0  
    cytoolz                   0.9.0.1          py36h14c3975_1  
    dask                      0.20.2                   py36_0  
    dask-core                 0.20.2                   py36_0  
    datashape                 0.5.4                    py36_1  
    dbus                      1.13.2               h714fa37_1  
    decorator                 4.3.0                    py36_0  
    defusedxml                0.5.0                    py36_1  
    distributed               1.24.2                   py36_0  
    docutils                  0.14                     py36_0  
    entrypoints               0.2.3                    py36_2  
    et_xmlfile                1.0.1                    py36_0  
    expat                     2.2.6                he6710b0_0  
    experi                    0.2.11                    <pip>
    fastcache                 1.0.2            py36h14c3975_2  
    filelock                  3.0.10                   py36_0  
    flask                     1.0.2                    py36_1  
    flask-cors                3.0.7                    py36_0  
    fontconfig                2.13.0               h9420a91_0  
    freetype                  2.9.1                h8a8886c_1  
    fribidi                   1.0.5                h7b6447c_0  
    get_terminal_size         1.0.0                haa9412d_0  
    gevent                    1.3.7            py36h7b6447c_1  
    glib                      2.56.2               hd408876_0  
    glob2                     0.6                      py36_1  
    gmp                       6.1.2                h6c8ec71_1  
    gmpy2                     2.0.8            py36h10f8cd9_2  
    graphite2                 1.3.12               h23475e2_2  
    greenlet                  0.4.15           py36h7b6447c_0  
    gst-plugins-base          1.14.0               hbbd80ab_1  
    gstreamer                 1.14.0               hb453b48_1  
    h5py                      2.8.0            py36h989c5e5_3  
    harfbuzz                  1.8.8                hffaf4a1_0  
    hdf4                      4.2.13               h3ca952b_2  
    hdf5                      1.10.2               hba1933b_1  
    heapdict                  1.0.0                    py36_2  
    html5lib                  1.0.1                    py36_0  
    hyperlink                 18.0.0                   py36_0  
    icu                       58.2                 h9c2bf20_1  
    idna                      2.7                      py36_0  
    imageio                   2.4.1                    py36_0  
    imagesize                 1.1.0                    py36_0  
    importlib_metadata        0.6                      py36_0  
    incremental               17.5.0                   py36_0  
    intel-openmp              2019.1                      144  
    ipykernel                 5.1.0            py36h39e3cac_0  
    ipython                   7.1.1            py36h39e3cac_0  
    ipython_genutils          0.2.0                    py36_0  
    ipywidgets                7.4.2                    py36_0  
    isort                     4.3.4                    py36_0  
    itsdangerous              1.1.0                    py36_0  
    jbig                      2.1                  hdba287a_0  
    jdcal                     1.4                      py36_0  
    jedi                      0.13.1                   py36_0  
    jeepney                   0.4                      py36_0  
    jinja2                    2.10                     py36_0  
    jpeg                      9b                   h024ee3a_2  
    jsonschema                2.6.0                    py36_0  
    jupyter                   1.0.0                    py36_7  
    jupyter_client            5.2.3                    py36_0  
    jupyter_console           6.0.0                    py36_0  
    jupyter_core              4.4.0                    py36_0  
    jupyterlab                0.35.3                   py36_0  
    jupyterlab_launcher       0.13.1                   py36_0  
    jupyterlab_server         0.2.0                    py36_0  
    keyring                   16.1.0                   py36_0  
    kiwisolver                1.0.1            py36hf484d3e_0  
    lazy-object-proxy         1.3.1            py36h14c3975_2  
    libcurl                   7.61.0               h1ad7b7a_0  
    libedit                   3.1.20170329         h6b74fdf_2  
    libffi                    3.2.1                hd88cf55_4  
    libgcc-ng                 8.2.0                hdf63c60_1  
    libgfortran-ng            7.3.0                hdf63c60_0  
    libnetcdf                 4.6.1                h10edf3e_1  
    libpng                    1.6.35               hbc83047_0  
    libsodium                 1.0.16               h1bed415_0  
    libssh2                   1.8.0                h9cfc8f7_4  
    libstdcxx-ng              8.2.0                hdf63c60_1  
    libtiff                   4.0.9                he85c1e1_2  
    libtool                   2.4.6                h7b6447c_5  
    libuuid                   1.0.3                h1bed415_2  
    libxcb                    1.13                 h1bed415_1  
    libxml2                   2.9.8                h26e45fe_1  
    libxslt                   1.1.32               h1312cb7_0  
    llvmlite                  0.25.0           py36hd408876_0  
    locket                    0.2.0                    py36_1  
    lxml                      4.2.5            py36hefd8a0e_0  
    lzo                       2.10                 h49e0be7_2  
    markupsafe                1.1.0            py36h7b6447c_0  
    matplotlib                3.0.1            py36h5429711_0  
    mccabe                    0.6.1                    py36_1  
    mistune                   0.8.4            py36h7b6447c_0  
    mkl                       2018.0.3                      1  
    mkl-service               1.1.2            py36h90e4bf4_5  
    mkl_fft                   1.0.6            py36h7dd41cf_0  
    mkl_random                1.0.1            py36h4414c95_1  
    more-itertools            4.3.0                    py36_0  
    mpc                       1.1.0                h10f8cd9_1  
    mpfr                      4.0.1                hdf1c602_3  
    mpmath                    1.0.0                    py36_2  
    msgpack-python            0.5.6            py36h6bb024c_1  
    multipledispatch          0.6.0                    py36_0  
    natsort                   5.5.0                     <pip>
    nbconvert                 5.3.1                    py36_0  
    nbformat                  4.4.0                    py36_0  
    ncurses                   6.1                  he6710b0_1  
    netcdf4                   1.4.2            py36h4b4f87f_0  
    networkx                  2.2                      py36_1  
    nltk                      3.3.0                    py36_0  
    nose                      1.3.7                    py36_2  
    notebook                  5.7.2                    py36_0  
    numba                     0.40.0           py36h962f231_0  
    numexpr                   2.6.8            py36hd89afb7_0  
    numpy                     1.15.4           py36h1d66e8a_0  
    numpy-base                1.15.4           py36h81de0dd_0  
    numpydoc                  0.8.0                    py36_0  
    odo                       0.5.1                    py36_0  
    olefile                   0.46                     py36_0  
    openpyxl                  2.5.9                    py36_0  
    openssl                   1.0.2p               h14c3975_0  
    packaging                 18.0                     py36_0  
    pandas                    0.23.4           py36h04863e7_0  
    pandoc                    2.2.3.2                       0  
    pandocfilters             1.4.2                    py36_1  
    pango                     1.42.4               h049681c_0  
    parso                     0.3.1                    py36_0  
    partd                     0.3.9                    py36_0  
    patchelf                  0.9                  he6710b0_3  
    path.py                   11.5.0                   py36_0  
    pathlib2                  2.3.2                    py36_0  
    patsy                     0.5.1                    py36_0  
    pcre                      8.42                 h439df22_0  
    pep8                      1.7.1                    py36_0  
    pexpect                   4.6.0                    py36_0  
    pickleshare               0.7.5                    py36_0  
    pillow                    5.3.0            py36h34e0f95_0  
    pip                       18.1                     py36_0  
    pixman                    0.34.0               hceecf20_3  
    pkginfo                   1.4.2                    py36_1  
    pluggy                    0.8.0                    py36_0  
    ply                       3.11                     py36_0  
    prometheus_client         0.4.2                    py36_0  
    prompt_toolkit            2.0.7                    py36_0  
    psutil                    5.4.8            py36h7b6447c_0  
    ptyprocess                0.6.0                    py36_0  
    py                        1.7.0                    py36_0  
    pyasn1                    0.4.4            py36h28b3542_0  
    pyasn1-modules            0.2.2                    py36_0  
    pycodestyle               2.4.0                    py36_0  
    pycosat                   0.6.3            py36h14c3975_0  
    pycparser                 2.19                     py36_0  
    pycrypto                  2.6.1            py36h14c3975_9  
    pycurl                    7.43.0.2         py36hb7f436b_0  
    pyflakes                  2.0.0                    py36_0  
    pygments                  2.2.0                    py36_0  
    pyhamcrest                1.9.0                    py36_2  
    pylint                    2.1.1                    py36_0  
    pyodbc                    4.0.24           py36he6710b0_0  
    pyopenssl                 18.0.0                   py36_0  
    pyparsing                 2.3.0                    py36_0  
    pyqt                      5.9.2            py36h05f1152_2  
    pysocks                   1.6.8                    py36_0  
    pytables                  3.4.4            py36ha205bf6_0  
    pytest                    4.0.0                    py36_0  
    pytest-arraydiff          0.2              py36h39e3cac_0  
    pytest-astropy            0.4.0                    py36_0  
    pytest-doctestplus        0.2.0                    py36_0  
    pytest-openfiles          0.3.0                    py36_0  
    pytest-remotedata         0.3.1                    py36_0  
    python                    3.6.6                h6e4f718_2  
    python-dateutil           2.7.5                    py36_0  
    pytz                      2018.7                   py36_0  
    pywavelets                1.0.1            py36hdd07704_0  
    pyyaml                    3.13             py36h14c3975_0  
    pyzmq                     17.1.2           py36h14c3975_0  
    qt                        5.9.6                h8703b6f_2  
    qtawesome                 0.5.3                    py36_0  
    qtconsole                 4.4.2                    py36_0  
    qtpy                      1.5.2                    py36_0  
    readline                  7.0                  h7b6447c_5  
    requests                  2.20.1                   py36_0  
    rope                      0.11.0                   py36_0  
    ruamel_yaml               0.15.46          py36h14c3975_0  
    scikit-image              0.14.0           py36hf484d3e_1  
    scikit-learn              0.20.1           py36h4989274_0  
    scipy                     1.1.0            py36hfa4b5c9_1  
    seaborn                   0.9.0                    py36_0  
    secretstorage             3.1.0                    py36_0  
    send2trash                1.5.0                    py36_0  
    service_identity          17.0.0           py36h28b3542_0  
    setuptools                40.6.2                   py36_0  
    simplegeneric             0.8.1                    py36_2  
    singledispatch            3.4.0.3                  py36_0  
    sip                       4.19.8           py36hf484d3e_0  
    six                       1.11.0                   py36_1  
    snappy                    1.1.7                hbae5bb6_3  
    snowballstemmer           1.2.1                    py36_0  
    sortedcollections         1.0.1                    py36_0  
    sortedcontainers          2.0.5                    py36_0  
    sphinx                    1.8.2                    py36_0  
    sphinxcontrib             1.0                      py36_1  
    sphinxcontrib-websupport  1.1.0                    py36_1  
    spyder                    3.3.2                    py36_0  
    spyder-kernels            0.3.0                    py36_0  
    sqlalchemy                1.2.14           py36h7b6447c_0  
    sqlite                    3.25.3               h7b6447c_0  
    statsmodels               0.9.0            py36h035aef0_0  
    sympy                     1.3                      py36_0  
    tblib                     1.3.2                    py36_0  
    terminado                 0.8.1                    py36_1  
    testpath                  0.4.2                    py36_0  
    tk                        8.6.8                hbc83047_0  
    toolz                     0.9.0                    py36_0  
    tornado                   5.1.1            py36h7b6447c_0  
    tqdm                      4.28.1           py36h28b3542_0  
    traitlets                 4.3.2                    py36_0  
    twisted                   18.9.0           py36h7b6447c_0  
    typed-ast                 1.1.0            py36h14c3975_0  
    unicodecsv                0.14.1                   py36_0  
    unixodbc                  2.3.7                h14c3975_0  
    urllib3                   1.23                     py36_0  
    wcwidth                   0.1.7                    py36_0  
    webencodings              0.5.1                    py36_1  
    werkzeug                  0.14.1                   py36_0  
    wheel                     0.32.3                   py36_0  
    widgetsnbextension        3.4.2                    py36_0  
    wrapt                     1.10.11          py36h14c3975_2  
    wurlitzer                 1.0.2                    py36_0  
    xarray                    0.10.9+50.g17815b4           <pip>
    xBOUT                     0.1                       <pip>
    xcollect                  0.1                       <pip>
    xlrd                      1.1.0                    py36_1  
    xlsxwriter                1.1.2                    py36_0  
    xlwt                      1.3.0                    py36_0  
    xstorm                    0.1                       <pip>
    xz                        5.2.4                h14c3975_4  
    yaml                      0.1.7                had09818_2  
    zeromq                    4.2.5                hf484d3e_1  
    zict                      0.1.3                    py36_0  
    zlib                      1.2.11               h7b6447c_3  
    zope                      1.0                      py36_1  
    zope.interface            4.6.0            py36h7b6447c_0
    
    opened by TomNicholas 5
  • conda-forge package

    conda-forge package

    While this is a pure python package, pip likes to mangle conda packages sometimes. So, if someone tries to install Animatplot with a version of matplotlib < 2.2 which was installed with conda, then pip attempts to update matplotlib and butcher the environment (sometimes multiple since conda symlinks packages of the same version across environments).

    I'd like to be able to install Animatplot with conda.

    packaging 
    opened by t-makaro 5
  • Suggestion for xarray integration

    Suggestion for xarray integration

    A simple example showing some of the advantages of providing convenience functions for plotting xarray DataArrays. xarray integration means that you could streamline the visualisation of time-evolving data down to just a few lines, e.g.:

    data = xr.load_dataset('3d_data.nc')
    anim, block, timeline = amp.animated_plot(da)
    anim.save_gif('./xarray_imshow')
    plt.show()
    

    Although I think full seamless integration into xarray's system would be quite involved (and not something I'm qualified to do), then providing a set of convenience functions something like this shouldn't be very difficult.

    Notice there are several # TODOs in the code showing how this could be extended.

    Let me know what you think!

    opened by TomNicholas 5
  • matplotlib3.3 shading=

    matplotlib3.3 shading="nearest" compatibility

    matplotlib-3.3 adds a new option shading="nearest" for pcolormesh. This PR makes animatplot compatible with that option. Now also works with shading="gouraud" when matplotlib=3.3. Don't know why shading="gouraud" still doesn't work with matplotlib<=3.2, I guess they changed something in the internals.

    opened by johnomotani 4
  • Line block tests

    Line block tests

    I added some unit tests for blocks.Line(), and extended it to also accept a 1D array input for x (the most natural format for use in xarray).

    I also tried to clarify the logic for parsing the input, and make it raise more informative errors.

    One high-level question - why allow users to input a list of numpy arrays at all? It makes the internal logic more complex and I don't really see what the benefit is. The only time a list of numpy arrays is a more suitable representation of data than a numpy array with an extra dimension is if the length of the array changes over time, but I don't know if that's actually supported by the plotting functions? Also if you do want to support do you want to keep the data internally as a list of arrays? Or is it okay to do what I did here and convert all lists of arrays straight to numpy arrays using np.asanyarray()?

    opened by TomNicholas 3
  • animatplot.testing is not installed

    animatplot.testing is not installed

    It appears that the animatplot.testing package is not installed; this means that tests cannot be run against an installed copy because the import doesn't work.

    opened by QuLogic 3
  • Add optional argument 'time_label' to 'timeline_slider'

    Add optional argument 'time_label' to 'timeline_slider'

    Allows you to have a timeline which has a label other than "Time". Useful for when you want to animate your data over a non-temporal dimension, e.g. space.

    Implemented as an optional argument to 'timeline_slider()', so usage looks like:

    anim.controls(timeline_slider_args={'time_label': 'x position'})
    

    Not sure if this should instead be implemented as an extra attribute on the timeline?

    opened by TomNicholas 3
  • Control of progress bar label?

    Control of progress bar label?

    Hi there

    As far as I can tell there is currently no way to control the format of the label to the progress bar in animations?

    I have this currently...

    import animatplot as amp
    t = (np.arange(speed.shape[0])/12.+1950)
    tt = t.astype(int)
    .
    .
    .
    anim = amp.Animation([im], amp.Timeline(tt))
    anim.controls()
    anim.save_gif('surface-ocean-circulation')
    

    This gives 1950,1951,... but the labels on the progress bar are to 2 decimal places, see attached screenshot.

    Is it possible to have further control over this, for example integer labels or even strings?

    Many thanks

    Jonny Williams NIWA, New Zealand

    image

    opened by jonnyhtw 2
  • incompatibility with pcolormesh `shading=

    incompatibility with pcolormesh `shading="nearest"` option in matplotlib-3.3

    Adapting the pcolormesh example, and using the new shading="nearest" option from matplotlib-3.3.2

    import numpy as np
    import matplotlib.pyplot as plt
    import animatplot as amp
    
    
    x = np.linspace(-2, 2, 50)
    y = np.linspace(-2, 2, 50)
    t = np.linspace(0, 2*np.pi, 40)
    
    X, Y, T = np.meshgrid(x, y, t)
    
    Z = np.sin(X*X+Y*Y-T)
    
    shading = "nearest"
    #shading = "flat"
    block = amp.blocks.Pcolormesh(X[:,:,0], Y[:,:,0], Z, t_axis=2, cmap='RdBu', shading=shading)
    plt.colorbar(block.quad)
    plt.gca().set_aspect('equal')
    
    anim = amp.Animation([block], amp.Timeline(t))
    
    anim.controls()
    
    anim.save_gif('pcolormesh')
    plt.show()
    

    gives pcolormesh

    instead of the expected result, which we get with shading="flat" pcolormesh

    I suspect this is related to flattening the array here https://github.com/t-makaro/animatplot/blob/632d988687fca7e7415e9fa49fe7eebc3f0991c6/animatplot/blocks/image_like.py#L57-L60

    opened by johnomotani 1
  • probably a bug in matplotlib 3.5.2

    probably a bug in matplotlib 3.5.2

    Running your example of vect_plot (0.4.2, matplotlib 3.5.2) I get:

    "name": "ValueError",
    	"message": "Passing parameters norm and vmin/vmax simultaneously is not supported. 
    Please pass vmin/vmax directly to the norm when creating it.",
    

    can be solved by replacing:

    pargs = {
        'norm' : mpl.colors.LogNorm(),
        'vmax': 1000,
        'vmin': .1,
        'cmap': 'pink',
    }
    

    with:

    pargs = {
        'norm' : colors.Normalize(vmin = 0, vmax = 1000),
        'cmap': 'bwr',
    }
    
    opened by alexlib 0
  • BunchOfFiles writer incompatible with matplotlib-3.4

    BunchOfFiles writer incompatible with matplotlib-3.4

    The implementation of matplotlib.animation.FileMovieWriter seems to have changed in matplotlib-3.4, and the _frame_sink member no longer exists. This makes the unit tests fail. I guess BunchOfFiles needs to be updated, maybe following the patters in matplotlib.animation https://matplotlib.org/stable/_modules/matplotlib/animation.html?

    opened by johnomotani 2
  • New block type for 'surface' plots

    New block type for 'surface' plots

    Adds a new Block subclass Surface to make surface plots using matplotlib's plot_surface() method.

    Makes animation by clearing plot and re-drawing. It was suggested that this is the best solution as majority of time is drawing rather than updating the array anyway, see https://stackoverflow.com/a/45713451/13577592.

    ~Making the vertical axis scale fixed doesn't work at the moment. Seems to be a bug with matplotlib's vmin and vmax arguments, see https://github.com/matplotlib/matplotlib/issues/19870.~

    ~Still needs tests and documentation.~

    opened by johnomotani 2
  • tight_layout() compatibility

    tight_layout() compatibility

    This PR attempts to make the animation controls (time-slider and play/pause button) compatible with use of tight_layout().

    Previously, calling tight_layout could arrange the animations in a figure, but would not move or take into account the controls, which would end up overlapping the lower part of the animations.

    This PR seems to work, but requires accessing a private variable of matplotlib.figure.Figure to get the gridspec, in order to modify it to add the controls. Also modifies a private member of matplotlib.gridspec.Gridspec to modify the number of rows. It would be nice if matplotlib provided public methods to access and update gridspecs, but as far as I can see they do not at the moment.

    One issue is that the current implementation seems to reserve too much whitespace around the controls. It would be nice to find a way to allow tight_layout() to modify the amount of space above/below the slider.

    opened by johnomotani 1
  • Would you like more developers?

    Would you like more developers?

    This library is great, you've done a really nice job with it so far @t-makaro .

    I'm using it pretty regularly, and getting close to having it integrated within xarray through https://github.com/pydata/xarray/pull/2729.

    This will hopefully increase the number of people using animatplot (both directly and indirectly through xarray), and will probably mean you get more suggestions and bugs found.

    Would you like any help with the maintainance of the library? Me and @dcherian are both keen to use this, and if one of us also had commit access then we could push bug fixes for you. We could have some kind of "all PRs need a review" rule, and you retain control over the scope? What do you think?

    opened by TomNicholas 7
Releases(0.4.1)
  • 0.4.0(Feb 23, 2019)

    The changelog needs to be updated for release.

    • Improved Line Block input handling and testing
    • Added title block
    • Timeline_slider now defaults the format specifier valfmt to None. If set to None, it will use %1.2% for most cases, but %s for np.datetime.

    Backwards incompatible changes:

    • The x, y inputs to the Line Block are not positional only
    • Removed axis kwargs that deprecated in favor of ax in 0.3.0

    Dev changes:

    • testing tools was moving into the tests folder and is no longer a subpackage of animatplot.
    • CircleCI script was refactored

    This release has multiple contributors (and the first release to have such): t-makaro TomNicholas* dcherian*

    *indicates new contributor.

    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Oct 29, 2018)

    Deprecations

    • The axis keyword argument has been replaced (everywhere) in favour of ax, and axis will be removed completely in 0.4.0. This does not apply to t_axis which is unchanged. See #10 for rational.

    Features

    • The Pcolormesh block now accepts 1D arrays (in addition to 2D) for x and y inputs. Animation.timeline_slider now accepts a text argument to change the name of the slider.
    • New blocks:
      • Scatter for animating scatter plots. Capable of animating size and position of the points, but not yet the color.
      • Update a block that accepts a generic function that takes a frame number. Good if another block doesn’t already exist for some tasks.
    • Composition Blocks: These are functions that return a list of blocks (and maybe a timeline). These are in the blocks subpackage and can be identified by the _comp suffix.
    • New (and very experimental) animations subpackage (well new to the public api). Contains some new convenice functions.
      • vector_plot wraps Pcolormesh and Quiver to produce animated vector fields.

    Bug Fixes

    • Previously, an Animation with a timeline_slider, but no toggle would cause an error.

    Breaking Changes

    • The text argument to timeline_slider is now the first positional argument.
    • The order of positional arguments for the Nuke block has changed. This was required to give the ax argument a default.

    Developer Changes

    • New animation unittesting framework
    • Tests / doc building now runs on CircleCI.
    Source code(tar.gz)
    Source code(zip)
  • 0.2.2(Aug 7, 2018)

  • 0.2.0(Aug 7, 2018)

  • 0.2.0.dev1(Aug 6, 2018)

    The first release of 0.2.0 to PyPI. This release is close to future complete, but Pcolormesh and Quiver blocks need some polishing, and tutorials need to be written.

    Source code(tar.gz)
    Source code(zip)
  • 0.1.dev3(Jul 26, 2018)

Owner
Tyler Makaro
I'm a graduate of physics and mathematics from the University of Victoria.
Tyler Makaro
BrowZen correlates your emotional states with the web sites you visit to give you actionable insights about how you spend your time browsing the web.

BrowZen BrowZen correlates your emotional states with the web sites you visit to give you actionable insights about how you spend your time browsing t

Nick Bild 36 Sep 28, 2022
Automatically generate GitHub activity!

Commit Bot Automatically generate GitHub activity! We've all wanted to be the developer that commits every day, but that requires a lot of work. Let's

Ricky 4 Jun 07, 2022
CPG represent!

CoolPandasGroup CPG represent! Arianna Brandon Enne Luan Tracie Project requirements: use Pandas to clean and format datasets use Jupyter Notebook to

Enne 3 Feb 07, 2022
Data visualization electromagnetic spectrum

Datenvisualisierung-Elektromagnetischen-Spektrum Anhand des Moduls matplotlib sollen die Daten des elektromagnetischen Spektrums dargestellt werden. D

Pulsar 1 Sep 01, 2022
Keir&'s Visualizing Data on Life Expectancy

Keir's Visualizing Data on Life Expectancy Below is information on life expectancy in the United States from 1900-2017. You will also find information

9 Jun 06, 2022
Graphical visualizer for spectralyze by Lauchmelder23

spectralyze visualizer Graphical visualizer for spectralyze by Lauchmelder23 Install Install matplotlib and ffmpeg. Put ffmpeg.exe in same folder as v

Matthew 1 Dec 21, 2021
Learn Data Science with focus on adding value with the most efficient tech stack.

DataScienceWithPython Get started with Data Science with Python An engaging journey to become a Data Scientist with Python TL;DR Download all Jupyter

Learn Python with Rune 110 Dec 22, 2022
Python package to Create, Read, Write, Edit, and Visualize GSFLOW models

pygsflow pyGSFLOW is a python package to Create, Read, Write, Edit, and Visualize GSFLOW models API Documentation pyGSFLOW API documentation can be fo

pyGSFLOW 21 Dec 14, 2022
A python visualization of the A* path finding algorithm

A python visualization of the A* path finding algorithm. It allows you to pick your start, end location and make obstacles and then view the process of finding the shortest path. You can also choose

Kimeon 4 Aug 02, 2022
Python ts2vg package provides high-performance algorithm implementations to build visibility graphs from time series data.

ts2vg: Time series to visibility graphs The Python ts2vg package provides high-performance algorithm implementations to build visibility graphs from t

Carlos Bergillos 26 Dec 17, 2022
A way of looking at COVID-19 data that I haven't seen before.

Visualizing Omicron: COVID-19 Deaths vs. Cases Click here for other countries. Data is from Our World in Data/Johns Hopkins University. About this pro

1 Jan 10, 2022
Sentiment Analysis application created with Python and Dash, hosted at socialsentiment.net

Social Sentiment Dash Application Live-streaming sentiment analysis application created with Python and Dash, hosted at SocialSentiment.net. Dash Tuto

Harrison 456 Dec 25, 2022
A python wrapper for creating and viewing effects for Matt Parker's christmas tree.

Christmas Tree Visualizer A python wrapper for creating and viewing effects for Matt Parker's christmas tree. Displays py or csv effect files and allo

4 Nov 22, 2022
Plot, scatter plots and histograms in the terminal using braille dots

Plot, scatter plots and histograms in the terminal using braille dots, with (almost) no dependancies. Plot with color or make complex figures - similar to a very small sibling to matplotlib. Or use t

Tammo Ippen 207 Dec 30, 2022
Interactive chemical viewer for 2D structures of small molecules

👀 mols2grid mols2grid is an interactive chemical viewer for 2D structures of small molecules, based on RDKit. ➡️ Try the demo notebook on Google Cola

Cédric Bouysset 154 Dec 26, 2022
Python module for drawing and rendering beautiful atoms and molecules using Blender.

Batoms is a Python package for editing and rendering atoms and molecules objects using blender. A Python interface that allows for automating workflows.

Xing Wang 1 Jul 06, 2022
a python function to plot a geopandas dataframe

Pretty GeoDataFrame A minimum python function (~60 lines) to draw pretty geodataframe. Based on matplotlib, shapely, descartes. Installation just use

haoming 27 Dec 05, 2022
Backend app for visualizing CANedge log files in Grafana (directly from local disk or S3)

CANedge Grafana Backend - Visualize CAN/LIN Data in Dashboards This project enables easy dashboard visualization of log files from the CANedge CAN/LIN

13 Dec 15, 2022
A simple script that displays pixel-based animation on GitHub Activity

GitHub Activity Animator This project contains a simple Javascript snippet that produces an animation on your GitHub activity tracker. The project als

16 Nov 15, 2021
ecoglib: visualization and statistics for high density microecog signals

ecoglib: visualization and statistics for high density microecog signals This library contains high-level analysis tools for "topos" and "chronos" asp

1 Nov 17, 2021