Some useful extensions for Matplotlib.

Overview

mplx

Some useful extensions for Matplotlib.

PyPi Version PyPI pyversions GitHub stars Downloads

gh-actions codecov LGTM Code style: black

Contour plots for functions with discontinuities

plt.contour mplx.contour(max_jump=1.0)

Matplotlib has problems with contour plots of functions that have discontinuities. The software has no way to tell discontinuities and very sharp, but continuous cliffs apart, and contour lines will be drawn along the discontinuity.

mplx improves upon this by adding the parameter max_jump. If the difference between two function values in the grid is larger than max_jump, a discontinuity is assumed and no line is drawn. Similarly, min_jump can be used to highlight the discontinuity.

As an example, take the function imag(log(Z)) for complex values Z. Matplotlib's contour lines along the negative real axis are wrong.

import matplotlib.pyplot as plt
import numpy as np

import mplx

x = np.linspace(-2.0, 2.0, 100)
y = np.linspace(-2.0, 2.0, 100)

X, Y = np.meshgrid(x, y)
Z = X + 1j * Y

vals = np.imag(np.log(Z))

# plt.contour(X, Y, vals, levels=[-2.0, -1.0, 0.0, 1.0, 2.0])  # draws wrong lines
mplx.contour(X, Y, vals, levels=[-2.0, -1.0, 0.0, 1.0, 2.0], max_jump=1.0)
mplx.contour(X, Y, vals, levels=[0.0], min_jump=1.0, linestyles=":")

plt.gca().set_aspect("equal")
plt.show()

Relevant discussions:

License

This software is published under the MIT license.

Comments
  • Remove some typing hint to support older numpy ?

    Remove some typing hint to support older numpy ?

    Hello, I got an error ModuleNotFoundError: No module named 'numpy.typing' due to the typing hint from numpy.typing import ArrayLike.

    Would you mind remove this hint to support older numpy version like 1.19.* ? It seems no performance issue after remove it.

    opened by ProV1denCEX 5
  • Support for horizontal barchart

    Support for horizontal barchart

    This PR solves #30 by adding an alignment argument to show_bar_values defaulting to "vertical".

    I couldn't think of a robust way of determining the alignment automatically. Checking if the width of the bar is greater or lower than its height seemed a bit dodgy in some cases... I don't know. What do you think @nschloe ?

    Usage (adapted from README demo):

    import matplotlib.pyplot as plt
    import matplotx
    
    labels = ["Australia", "Brazil", "China", "Germany", "Mexico", "United\nStates"]
    vals = [21.65, 24.5, 6.95, 8.40, 21.00, 8.55]
    ypos = range(len(vals))
    
    
    with plt.style.context(matplotx.styles.dufte_bar):
        plt.barh(ypos, vals)
        plt.yticks(ypos, labels)
        matplotx.show_bar_values("{:.2f}", alignment="horizontal")
        plt.title("average temperature [°C]")
        plt.tight_layout()
        plt.show()
    

    Produces: Figure_1

    opened by RemDelaporteMathurin 3
  • Support for horizontal barchart

    Support for horizontal barchart

    matplotx.show_bar_values works perfectly with vertical bar charts but not with horizontal bar charts.

    These are often used with long text labels.

    import matplotlib.pyplot as plt
    import matplotx
    
    labels = ["Australia", "Brazil", "China", "Germany", "Mexico", "United\nStates"]
    vals = [21.65, 24.5, 6.95, 8.40, 21.00, 8.55]
    ypos = range(len(vals))
    
    with plt.style.context(matplotx.styles.dufte_bar):
        plt.barh(ypos, vals)
        plt.yticks(ypos, labels)
        matplotx.show_bar_values("{:.2f}")
        plt.title("average temperature [°C]")
        plt.tight_layout()
        plt.show()
    
    

    Produces: image

    I can write a PR and add a show_hbar_values() function that works with horizontal bar charts and produces: image

    Or it can also be an argument of matplotx.show_bar_value defaulting to "vertical" like show_bar_value(alignement="horizontal")

    What do you think @nschloe ?

    opened by RemDelaporteMathurin 2
  • Citation

    Citation

    Great package! Thank you so much it really helps!

    I will surely use this in my next paper/talk. How can I cite this package?

    Do you plan on adding a Zenodo DOI?

    Cheers Remi

    opened by RemDelaporteMathurin 2
  • Some styles are broken

    Some styles are broken

    Using the code example in the readme:

    import matplotlib.pyplot as plt
    import matplotx
    plt.style.use(matplotx.styles.ayu)
    

    I get this error:

    File ~/.conda/envs/.../lib/python3.10/site-packages/matplotlib/style/core.py:117, in use(style)
        115 for style in styles:
        116     if not isinstance(style, (str, Path)):
    --> 117         _apply_style(style)
        118     elif style == 'default':
        119         # Deprecation warnings were already handled when creating
        120         # rcParamsDefault, no need to reemit them here.
        121         with _api.suppress_matplotlib_deprecation_warning():
    
    File ~/.conda/envs/.../lib/python3.10/site-packages/matplotlib/style/core.py:62, in _apply_style(d, warn)
         61 def _apply_style(d, warn=True):
    ---> 62     mpl.rcParams.update(_remove_blacklisted_style_params(d, warn=warn))
    
    File ~/.conda/envs/.../lib/python3.10/_collections_abc.py:994, in MutableMapping.update(self, other, **kwds)
        992 if isinstance(other, Mapping):
        993     for key in other:
    --> 994         self[key] = other[key]
        995 elif hasattr(other, "keys"):
        996     for key in other.keys():
    
    File ~/.conda/envs/.../lib/python3.10/site-packages/matplotlib/__init__.py:649, in RcParams.__setitem__(self, key, val)
        647     dict.__setitem__(self, key, cval)
        648 except KeyError as err:
    --> 649     raise KeyError(
        650         f"{key} is not a valid rc parameter (see rcParams.keys() for "
        651         f"a list of valid parameters)") from err
    
    KeyError: 'dark is not a valid rc parameter (see rcParams.keys() for a list of valid parameters)'
    

    Lib versions:

    matplotlib-base           3.5.2           py310h5701ce4_1    conda-forge
    matplotx                  0.3.7                    pypi_0    pypi
    

    This happens with aura, ayu, github, gruvbox and others.

    Some of the themes working are: challenger_deep, dracula, dufte, nord, tab10

    opened by floringogianu 1
  • Support for subplots

    Support for subplots

    Related to the issue I opened. It seems that small changes already go quite a long way towards support for subplots. This does not yet work for the style.

    For the original code, everything was correctly calculated with the axes in mind, but then it was applied to plt instead of ax, even if an ax parameter was supplied for line_labels, it was still applied to plt.

    The code changes should have no effect when there are no subplots. When there are subplots, the code now offers better support.

    import matplotlib.pyplot as plt
    import matplotx
    import numpy as np
    
    # create data
    rng = np.random.default_rng(0)
    offsets = [1.0, 1.50, 1.60]
    labels = ["no balancing", "CRV-27", "CRV-27*"]
    names = ["Plot left", "Plot right"]
    x0 = np.linspace(0.0, 3.0, 100)
    y = [offset * x0 / (x0 + 1) + 0.1 * rng.random(len(x0)) for offset in offsets]
    
    fig, axes = plt.subplots(2,1)                                           
    
    for ax, name in zip(axes, names):                                                         
        with plt.style.context(matplotx.styles.dufte):
            for yy, label in zip(y, labels):
                ax.plot(x0, yy, label=label)                                
            ax.set_xlabel("distance [m]")                                   
        matplotx.ylabel_top(name)    
        matplotx.line_labels(ax=ax)
    

    Original code

    image

    New code

    image

    opened by mitchellvanzuijlen 1
  • dufte.legend allow plt.text kwargs

    dufte.legend allow plt.text kwargs

    To draw the legend dufte uses plt.text() https://github.com/nschloe/dufte/blob/main/src/dufte/main.py#L196

    plt.text() allows for additional kwargs to customize the text https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.text.html

    If possible, could you loop through the additional text kwargs to allow for a higher customizable legend?

    opened by exc4l 0
  • Improper ylabel_top placement

    Improper ylabel_top placement

    I've been using matplotx.ylabel_top and just noticed an issue with the label placement after setting the y tick labels explicitly. A working example is below.

    import numpy as np
    from seaborn import scatterplot
    import matplotx
    
    rng = np.random.default_rng(42)
    x = rng.random(100)
    y = -2*x + rng.normal(0, 0.5, 100)
    ax = scatterplot(
        x=x,
        y=y
    )
    ax.set_yticks([0, -1, -2])
    matplotx.ylabel_top('Example\nLabel')
    

    example

    i'm using

    numpy==1.23.4
    seaborn==0.12.1
    matplotx==0.3.10
    
    opened by markmbaum 0
  • First example images not properly clickable in readme

    First example images not properly clickable in readme

    I just came across this project, looks really neat. Especially the smooth contourf got me curious.

    I've noticed in the readme that (at least on firefox) if I click any of the three images, the link that opens (even with the "open image in new tab" context menu option) is https://github.com/nschloe/matplotx/blob/main/tests/dufte_comparison.py. In contrast, the contourf images open just fine, for instance.

    I assume the reason for this is the enclosing a tag for the first example: https://github.com/nschloe/matplotx/blob/c767b08ea91492b1db9626b8b2c8786b4bc99458/README.md?plain=1#L39

    In case this is not just a firefox thing, I would recommend trying to make the first three images clickable on their own right.

    opened by adeak 0
  • Adapt `line_labels` for `PolyCollections`

    Adapt `line_labels` for `PolyCollections`

    I'm keen on making a PR to adapt line_labels to make it work with fill_between objects (PolyCollection)

    This would be the usage and output:

    import matplotlib.pyplot as plt
    import matplotx
    import numpy as np
    
    x = np.linspace(0, 1)
    y1 = np.linspace(1, 2)
    y2 = np.linspace(2, 4)
    
    plt.fill_between(x, y1, label="label1")
    plt.fill_between(x, y1, y2, label="label1")
    
    matplotx.label_fillbetween()
    plt.show()
    

    image

    @nschloe would you be interested in this feature?

    opened by RemDelaporteMathurin 0
  • Support for subplots

    Support for subplots

    Perhaps this is already implemented and I'm just unable to find it. I think this package in general is great; very easy to use and very beautiful. Thank you for your time making it.

    I'm unable to get matplotx working properly when using subplots. Adapting the Clean line plots (dufte) example to include two subplots (side-by-side, or one-below-the-other) appears not to work.

    import matplotlib.pyplot as plt
    import matplotx
    import numpy as np
    
    # create data
    rng = np.random.default_rng(0)
    offsets = [1.0, 1.50, 1.60]
    labels = ["no balancing", "CRV-27", "CRV-27*"]
    x0 = np.linspace(0.0, 3.0, 100)
    y = [offset * x0 / (x0 + 1) + 0.1 * rng.random(len(x0)) for offset in offsets]
    
    fig, axes = plt.subplots(2,1)                                           # add subplots
    
    for ax in axes:                                                         # Let's make two identical subplots
        with plt.style.context(matplotx.styles.dufte):
            for yy, label in zip(y, labels):
                ax.plot(x0, yy, label=label)                                # changed plt. to ax.
            ax.set_xlabel("distance [m]")                                   # changed plt. to ax.
            matplotx.ylabel_top("voltage [V]")                              # move ylabel to the top, rotate
            matplotx.line_labels()                                          # line labels to the right
            #plt.show()                                                     # Including this adds the 'pretty axis' below the subplots.                             
    

    image

    opened by mitchellvanzuijlen 2
Releases(v0.3.10)
Owner
Nico Schlömer
Mathematics, numerical analysis, scientific computing, Python. Always interested in new problems.
Nico Schlömer
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
Tidy data structures, summaries, and visualisations for missing data

naniar naniar provides principled, tidy ways to summarise, visualise, and manipulate missing data with minimal deviations from the workflows in ggplot

Nicholas Tierney 611 Dec 22, 2022
An easy to use burndown chart generator for GitHub Project Boards.

Burndown Chart for GitHub Projects An easy to use burndown chart generator for GitHub Project Boards. Table of Contents Features Installation Assumpti

Joseph Hale 15 Dec 28, 2022
Draw tree diagrams from indented text input

Draw tree diagrams This repository contains two very different scripts to produce hierarchical tree diagrams like this one: $ ./classtree.py collectio

Luciano Ramalho 8 Dec 14, 2022
The visual framework is designed on the idea of module and implemented by mixin method

Visual Framework The visual framework is designed on the idea of module and implemented by mixin method. Its biggest feature is the mixins module whic

LEFTeyes 9 Sep 19, 2022
A flexible tool for creating, organizing, and sharing visualizations of live, rich data. Supports Torch and Numpy.

Visdom A flexible tool for creating, organizing, and sharing visualizations of live, rich data. Supports Python. Overview Concepts Setup Usage API To

FOSSASIA 9.4k Jan 07, 2023
Graphing communities on Twitch.tv in a visually intuitive way

VisualizingTwitchCommunities This project maps communities of streamers on Twitch.tv based on shared viewership. The data is collected from the Twitch

Kiran Gershenfeld 312 Jan 07, 2023
Designed a greedy algorithm based on Markov sequential decision-making process in MATLAB/Python to optimize using Gurobi solver

Designed a greedy algorithm based on Markov sequential decision-making process in MATLAB/Python to optimize using Gurobi solver, the wheel size, gear shifting sequence by modeling drivetrain constrai

Sabbella Prasanna 1 Jan 11, 2022
Easily convert matplotlib plots from Python into interactive Leaflet web maps.

mplleaflet mplleaflet is a Python library that converts a matplotlib plot into a webpage containing a pannable, zoomable Leaflet map. It can also embe

Jacob Wasserman 502 Dec 28, 2022
NW 2022 Hackathon Project by Angelique Clara Hanzel, Aryan Sonik, Damien Fung, Ramit Brata Biswas

Spiral-Data-Visualizer NW 2022 Hackathon Project by Angelique Clara Hanzell, Aryan Sonik, Damien Fung, Ramit Brata Biswas Description This project vis

Damien Fung 2 Jan 16, 2022
Matplotlib JOTA style for making figures

Matplotlib JOTA style for making figures This repo has Matplotlib JOTA style to format plots and figures for publications and presentation.

JOTA JORNALISMO 2 May 05, 2022
Peloton Stats to Google Sheets with Data Visualization through Seaborn and Plotly

Peloton Stats to Google Sheets with Data Visualization through Seaborn and Plotly Problem: 2 peloton users were looking for a way to track their metri

9 Jul 22, 2022
Statistical data visualization using matplotlib

seaborn: statistical data visualization Seaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing

Michael Waskom 10.2k Dec 30, 2022
WebApp served by OAK PoE device to visualize various streams, metadata and AI results

DepthAI PoE WebApp | Bootstrap 4 & Vue.js SPA Dashboard Based on dashmin (https:

Luxonis 6 Apr 09, 2022
trade bot connected to binance API/ websocket.,, include dashboard in plotly dash to visualize trades and balances

Crypto trade bot 1. What it is Trading bot connected to Binance API. This project made for fun. So ... Do not use to trade live before you have backte

G 3 Oct 07, 2022
This is a sorting visualizer made with Tkinter.

Sorting-Visualizer This is a sorting visualizer made with Tkinter. Make sure you've installed tkinter in your system to use this visualizer pip instal

Vishal Choubey 7 Jul 06, 2022
A set of useful perceptually uniform colormaps for plotting scientific data

Colorcet: Collection of perceptually uniform colormaps Build Status Coverage Latest dev release Latest release Docs What is it? Colorcet is a collecti

HoloViz 590 Dec 31, 2022
Draw datasets from within Jupyter.

drawdata This small python app allows you to draw a dataset in a jupyter notebook. This should be very useful when teaching machine learning algorithm

vincent d warmerdam 505 Nov 27, 2022
MPL Plotter is a Matplotlib based Python plotting library built with the goal of delivering publication-quality plots concisely.

MPL Plotter is a Matplotlib based Python plotting library built with the goal of delivering publication-quality plots concisely.

Antonio López Rivera 162 Nov 11, 2022
Data visualization using matplotlib

Data visualization using matplotlib project instructions Top 5 Most Common Coffee Origins In this visualization I used data from Ankur Chavda on Kaggl

13 Oct 27, 2021