
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "gallery/showcase/mandelbrot.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. meta::
        :keywords: codex

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_gallery_showcase_mandelbrot.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_gallery_showcase_mandelbrot.py:


===================================
Shaded & power normalized rendering
===================================

The Mandelbrot set rendering can be improved by using a normalized recount
associated with a power normalized colormap (gamma=0.3). Rendering can be
further enhanced thanks to shading.

The ``maxiter`` gives the precision of the computation. ``maxiter=200`` should
take a few seconds on most modern laptops.

.. GENERATED FROM PYTHON SOURCE LINES 13-76



.. image-sg:: /gallery/showcase/images/sphx_glr_mandelbrot_001.png
   :alt: mandelbrot
   :srcset: /gallery/showcase/images/sphx_glr_mandelbrot_001.png, /gallery/showcase/images/sphx_glr_mandelbrot_001_2_00x.png 2.00x
   :class: sphx-glr-single-img





.. code-block:: Python

    import numpy as np


    def mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon=2.0):
        X = np.linspace(xmin, xmax, xn).astype(np.float32)
        Y = np.linspace(ymin, ymax, yn).astype(np.float32)
        C = X + Y[:, None] * 1j
        N = np.zeros_like(C, dtype=int)
        Z = np.zeros_like(C)
        for n in range(maxiter):
            I = abs(Z) < horizon
            N[I] = n
            Z[I] = Z[I]**2 + C[I]
        N[N == maxiter-1] = 0
        return Z, N


    if __name__ == '__main__':
        import time

        import matplotlib.pyplot as plt

        import matplotlib
        from matplotlib import colors

        xmin, xmax, xn = -2.25, +0.75, 3000 // 2
        ymin, ymax, yn = -1.25, +1.25, 2500 // 2
        maxiter = 200
        horizon = 2.0 ** 40
        log_horizon = np.log2(np.log(horizon))
        Z, N = mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon)

        # Normalized recount as explained in:
        # https://linas.org/art-gallery/escape/smooth.html
        # https://web.archive.org/web/20160331171238/https://www.ibm.com/developerworks/community/blogs/jfp/entry/My_Christmas_Gift?lang=en

        # This line will generate warnings for null values, but it is faster to
        # process them afterwards using the nan_to_num
        with np.errstate(invalid='ignore'):
            M = np.nan_to_num(N + 1 - np.log2(np.log(abs(Z))) + log_horizon)

        dpi = 72
        width = 10
        height = 10*yn/xn
        fig = plt.figure(figsize=(width, height), dpi=dpi)
        ax = fig.add_axes([0, 0, 1, 1], frameon=False, aspect=1)

        # Shaded rendering
        light = colors.LightSource(azdeg=315, altdeg=10)
        M = light.shade(M, cmap=plt.cm.hot, vert_exag=1.5,
                        norm=colors.PowerNorm(0.3), blend_mode='hsv')
        ax.imshow(M, extent=[xmin, xmax, ymin, ymax], interpolation="bicubic")
        ax.set_xticks([])
        ax.set_yticks([])

        # Some advertisement for matplotlib
        year = time.strftime("%Y")
        text = ("The Mandelbrot fractal set\n"
                "Rendered with matplotlib %s, %s - https://matplotlib.org"
                % (matplotlib.__version__, year))
        ax.text(xmin+.025, ymin+.025, text, color="white", fontsize=12, alpha=0.5)

        plt.show()


.. rst-class:: sphx-glr-timing

   **Total running time of the script:** (0 minutes 2.885 seconds)


.. _sphx_glr_download_gallery_showcase_mandelbrot.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: mandelbrot.ipynb <mandelbrot.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: mandelbrot.py <mandelbrot.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: mandelbrot.zip <mandelbrot.zip>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
