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
A Python toolbox for gaining geometric insights into high-dimensional data

"To deal with hyper-planes in a 14 dimensional space, visualize a 3D space and say 'fourteen' very loudly. Everyone does it." - Geoff Hinton Overview

Contextual Dynamics Laboratory 1.8k Dec 29, 2022
๐Ÿ“Š Charts with pure python

A zero-dependency python package that prints basic charts to a Jupyter output Charts supported: Bar graphs Scatter plots Histograms ๐Ÿ‘ ๐Ÿ“Š ๐Ÿ‘ Examples

Max Humber 54 Oct 04, 2022
Simple plotting for Python. Python wrapper for D3xter - render charts in the browser with simple Python syntax.

PyDexter Simple plotting for Python. Python wrapper for D3xter - render charts in the browser with simple Python syntax. Setup $ pip install PyDexter

D3xter 31 Mar 06, 2021
A Python package for caclulations and visualizations in geological sciences.

geo_calcs A Python package for caclulations and visualizations in geological sciences. Free software: MIT license Documentation: https://geo-calcs.rea

Drew Heasman 1 Jul 12, 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
3D Vision functions with end-to-end support for deep learning developers, written in Ivy.

Ivy vision focuses predominantly on 3D vision, with functions for camera geometry, image projections, co-ordinate frame transformations, forward warping, inverse warping, optical flow, depth triangul

Ivy 61 Dec 29, 2022
Lumen provides a framework for visual analytics, which allows users to build data-driven dashboards from a simple yaml specification

Lumen project provides a framework for visual analytics, which allows users to build data-driven dashboards from a simple yaml specification

HoloViz 120 Jan 04, 2023
Complex heatmaps are efficient to visualize associations between different sources of data sets and reveal potential patterns.

Make Complex Heatmaps Complex heatmaps are efficient to visualize associations between different sources of data sets and reveal potential patterns. H

Zuguang Gu 973 Jan 09, 2023
Resources for teaching & learning practical data visualization with python.

Practical Data Visualization with Python Overview All views expressed on this site are my own and do not represent the opinions of any entity with whi

Paul Jeffries 98 Sep 24, 2022
Python code for solving 3D structural problems using the finite element method

3DFEM Python 3D finite element code This python code allows for solving 3D structural problems using the finite element method. New features will be a

Rรฉmi Capillon 6 Sep 29, 2022
Matplotlib tutorial for beginner

matplotlib is probably the single most used Python package for 2D-graphics. It provides both a very quick way to visualize data from Python and publication-quality figures in many formats. We are goi

Nicolas P. Rougier 2.6k Dec 28, 2022
Interactive plotting for Pandas using Vega-Lite

pdvega: Vega-Lite plotting for Pandas Dataframes pdvega is a library that allows you to quickly create interactive Vega-Lite plots from Pandas datafra

Altair 342 Oct 26, 2022
Simple Inkscape Scripting

Simple Inkscape Scripting Description In the Inkscape vector-drawing program, how would you go about drawing 100 diamonds, each with a random color an

Scott Pakin 140 Dec 27, 2022
`charts.css.py` brings `charts.css` to Python. Online documentation and samples is available at the link below.

charts.css.py charts.css.py provides a python API to convert your 2-dimension data lists into html snippet, which will be rendered into charts by CSS,

Ray Luo 3 Sep 23, 2021
Generate "Jupiter" plots for circular genomes

jupiter Generate "Jupiter" plots for circular genomes Description Python scripts to generate plots from ViennaRNA output. Written in "pidgin" python w

Robert Edgar 2 Nov 29, 2021
1900-2016 Olympic Data Analysis in Python by plotting different graphs

๐Ÿ”ฅ Olympics Data Analysis ๐Ÿ”ฅ In Data Science field, there is a big topic before creating a model for future prediction is Data Analysis. We can find o

Sayan Roy 1 Feb 06, 2022
Rick and Morty Data Visualization with python

Rick and Morty Data Visualization For this project I looked at data for the TV show Rick and Morty Number of Episodes at a Certain Location Here is th

7 Aug 29, 2022
Simple function to plot multiple barplots in the same figure.

Simple function to plot multiple barplots in the same figure. Supports padding and custom color.

Matthias Jakobs 2 Feb 21, 2022
GitHub Stats Visualizations : Transparent

GitHub Stats Visualizations : Transparent Generate visualizations of GitHub user and repository statistics using GitHub Actions. โš ๏ธ Disclaimer The pro

YuanYap 7 Apr 05, 2022
Attractors is a package for simulation and visualization of strange attractors.

attractors Attractors is a package for simulation and visualization of strange attractors. Installation The simplest way to install the module is via

Vignesh M 45 Jul 31, 2022