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
2D maze path solver visualizer implemented with python

2D maze path solver visualizer implemented with python

SS 14 Dec 21, 2022
Small U-Net for vehicle detection

Small U-Net for vehicle detection Vivek Yadav, PhD Overview In this repository , we will go over using U-net for detecting vehicles in a video stream

Vivek Yadav 91 Nov 03, 2022
Extract and visualize information from Gurobi log files

GRBlogtools Extract information from Gurobi log files and generate pandas DataFrames or Excel worksheets for further processing. Also includes a wrapp

Gurobi Optimization 56 Nov 17, 2022
Set of matplotlib operations that are not trivial

Matplotlib Snippets This repository contains a set of matplotlib operations that are not trivial. Histograms Histogram with bins adapted to log scale

Raphael Meudec 1 Nov 15, 2021
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
Render tokei's output to interactive sunburst chart.

Render tokei's output to interactive sunburst chart.

134 Dec 15, 2022
Kglab - an abstraction layer in Python for building knowledge graphs

Graph Data Science: an abstraction layer in Python for building knowledge graphs, integrated with popular graph libraries – atop Pandas, RDFlib, pySHACL, RAPIDS, NetworkX, iGraph, PyVis, pslpython, p

derwen.ai 466 Jan 09, 2023
Automatically Visualize any dataset, any size with a single line of code. Created by Ram Seshadri. Collaborators Welcome. Permission Granted upon Request.

AutoViz Automatically Visualize any dataset, any size with a single line of code. AutoViz performs automatic visualization of any dataset with one lin

AutoViz and Auto_ViML 1k Jan 02, 2023
Fast 1D and 2D histogram functions in Python

About Sometimes you just want to compute simple 1D or 2D histograms with regular bins. Fast. No nonsense. Numpy's histogram functions are versatile, a

Thomas Robitaille 237 Dec 18, 2022
Simple CLI python app to show a stocks graph performance. Made with Matplotlib and Tiingo.

stock-graph-python Simple CLI python app to show a stocks graph performance. Made with Matplotlib and Tiingo. Tiingo API Key You will need to add your

Toby 3 May 14, 2022
Print matplotlib colors

mplcolors Tired of searching "matplotlib colors" every week/day/hour? This simple script displays them all conveniently right in your terminal emulato

Brandon Barker 32 Dec 13, 2022
Collection of data visualizing projects through Tableau, Data Wrapper, and Power BI

Data-Visualization-Projects Collection of data visualizing projects through Tableau, Data Wrapper, and Power BI Indigenous-Brands-Social-Movements Pyt

Jinwoo(Roy) Yoon 1 Feb 05, 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 package for hypergraph analysis and visualization.

The HyperNetX library provides classes and methods for the analysis and visualization of complex network data. HyperNetX uses data structures designed to represent set systems containing nested data

Pacific Northwest National Laboratory 304 Dec 27, 2022
Customizing Visual Styles in Plotly

Customizing Visual Styles in Plotly Code for a workshop originally developed for an Unconference session during the Outlier Conference hosted by Data

Data Design Dimension 9 Aug 03, 2022
Curvipy - The Python package for visualizing curves and linear transformations in a super simple way

Curvipy - The Python package for visualizing curves and linear transformations in a super simple way

Dylan Tintenfich 55 Dec 28, 2022
Data Visualizations for the #30DayChartChallenge

The #30DayChartChallenge This repository contains all the charts made for the #30DayChartChallenge during the month of April. This project aims to exp

Isaac Arroyo 7 Sep 20, 2022
Monochromatic colorscheme for matplotlib with opinionated sensible default

Monochromatic colorscheme for matplotlib with opinionated sensible default If you need a simple monochromatic colorscheme for your matplotlib figures,

Aria Ghora Prabono 2 May 06, 2022
Squidpy is a tool for the analysis and visualization of spatial molecular data.

Squidpy is a tool for the analysis and visualization of spatial molecular data. It builds on top of scanpy and anndata, from which it inherits modularity and scalability. It provides analysis tools t

Theis Lab 251 Dec 19, 2022
A Python-based non-fungible token (NFT) generator built using Samilla and Matplotlib

PyNFT A Pythonic NF (non-fungible token) generator built using Samilla and Matplotlib Use python pynft.py [amount] The intention behind this generato

Ayush Gundawar 6 Feb 07, 2022