Skip to content

nightade/cplot

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cplot

Plot complex-valued functions with style.

PyPi Version PyPI pyversions GitHub stars PyPi downloads

Discord

gh-actions codecov Code style: black

cplot helps plotting complex-valued functions in a visually appealing manner. The general idea is to map the absolute value to lightness and the complex argument (the "angle") to the chroma of the representing color. This follows the domain coloring approach, also described by John D. Cook and Elias Wegert in the book Visual Complex Functions (with some tweaks). Also check out the DC gallery by Juan Carlos Ponce Campuzano.

Similar projects:

Install with

pip install cplot

and use as

import cplot
import numpy

cplot.show(numpy.tan, -5, +5, -5, +5, 100, 100)

cplot.savefig("out.png", numpy.tan, -5, +5, -5, +5, 100, 100)
cplot.imsave("out.png", numpy.tan, -5, +5, -5, +5, 100, 100)

# There is a tripcolor function as well for triangulated 2D domains
# cplot.tripcolor(triang, z)

# The function get_srgb1 returns the SRGB1 triple for every complex input value.
# (Accepts arrays, too.)
z = 2 + 5j
val = cplot.get_srgb1(z)

All functions have the optional arguments (with their default values)

alpha = 1  # >= 0
colorspace = "cam16"  # "cielab", "oklab", "hsl"
  • alpha can be used to adjust the use of colors. A value less than 1 adds more color which can help isolating the roots and poles (which are still black and white, respectively). alpha=0 ignores the magnitude of f(z) completely.

  • colorspace can be set to hsl to get the common fully saturated, vibrant colors. This is usually a bad idea since it creates artifacts which are not related with the underlying data. From Wikipedia:

    Since the HSL color space is not perceptually uniform, one can see streaks of perceived brightness at yellow, cyan, and magenta (even though their absolute values are the same as red, green, and blue) and a halo around L = 1 / 2 . Use of the Lab color space corrects this, making the images more accurate, but also makes them more drab/pastel.

    Default is "cam16"; very similar is "cielab" (not shown here).

Consider the test function (z ** 2 - 1) * (z - 2 - 1j) ** 2 / (z ** 2 + 2 + 2j):

alpha = 1 alpha = 0.5 alpha = 0.0

The representation is chosen such that

  • values around 0 are black,
  • values around infinity are white,
  • values around +1 are green,
  • values around -1 are deep purple,
  • values around +i are blue,
  • values around -i are orange.

(Compare to the z1 reference plot below.)

With this, it is easy to see where a function has very small and very large values, and the multiplicty of zeros and poles is instantly identified by counting the color wheel passes around a black or white point.

Gallery

All plots are created with default settings.

z**1 z**2 z**3
1/z z / abs(z) (z+1) / (z-1)
z ** z (1/z) ** z z ** (1/z)
numpy.sqrt z**(1/3) z**(1/4)
numpy.log numpy.exp exp(1/z)
numpy.sin numpy.cos numpy.tan
numpy.sinh numpy.cosh numpy.tanh
numpy.arcsin numpy.arccos numpy.arctan
sin(z) / z cos(z) / z tan(z) / z
scipy.special.gamma scipy.special.digamma mpmath.zeta
mpmath.siegeltheta mpmath.siegelz Riemann-Xi

Testing

To run the cplot unit tests, check out this repository and type

pytest

License

This software is published under the GPLv3 license.

About

🌈 Color maps for complex-valued functions

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 96.2%
  • Makefile 3.8%