The idea comes from Jan Homann, who uploaded a picture of the Riemann Zeta function to Wikipedia.
ComplexGraph[f_, xmin_, xmax_, ymin_, ymax_, points_:100] :=
(* f is the complex function to be graphed
in the region[xmin, xmax] × [ymin, ymax] .
The parameter points controls how many points will be
sampled in each direction; good values are 100 - 500. *)
RegionPlot[True, {x, xmin, xmax}, {y, ymin, ymax},
ColorFunction → Function[
{x, y}, Hue[Mod[Arg[f[x + I * y]], 2Pi]/(2Pi),
1/(1 + 0.3 Log[Abs[f[x + I * y]] + 1]),
1 - 1/(1.1 + 5Log[Abs[f[x + I * y]] + 1])]],
ColorFunctionScaling → False,
AspectRatio → Automatic,
PlotPoints → points]
The following is the color function used for all our examples. The argument of a complex value is encoded by the hue of a color (red = positive real, and then counterclockwise through yellow, green, cyan, blue and purple; cyan stands for negative real). Strong colors denote points close to the origin, black = 0, weak colors denote points with large absolute value, white = ∞.
ComplexGraph[Function[z, z], -50, 50, -50, 50, 100]
Here is a picture of f(z) = z^3. The color of the point z encodes the value f(z) according to the above color function:
ComplexGraph[Function[z, z^3], -10, 10, -10, 10, 200]
A fifth-degree polynomial, with three zeros of order 1 and one zero of order 2:
ComplexGraph[Function[z, z (z - I) (z - 3) (z
- 1 + I)^2], -5, 5, -5, 5, 200]
The sine-function. Note that it is periodic in x-direction, but growing in positive and negative y-direction. As expected, only red and cyan on the real axis. Also note that in the upper half plane the order of the colors is reversed compared to the lower half-plane. Who knew? Well I guess it follows from the fact that the Taylor coefficients of sin(z) are all real, and so sin(z)=sin(z).
The exponential function. Nice and periodic in y-direction, growing in x-direction:
ComplexGraph[Exp, -10, 10, -10, 10, 200]
The logarithm near the interesting spots z=0 (pole) and z=1 (zero).
ComplexGraph[Log, -2, 2, -2, 2, 200]
The clearly visible branch cut on the negative real axis is an artifact; the natural domain of the logarithm is its Riemann surface:
ParametricPlot3D[{r * Cos[theta], r * Sin[theta], theta/3},
{theta, -3Pi, 3Pi}, {r, 0, 4}, PlotPoints → 100, Mesh → None,
ColorFunctionScaling → False,
ColorFunction → Function[
{x, y, z, theta, r}, Hue[
Mod[Arg[I * theta + Log[r]], 2Pi]/(2Pi),
1/(1 + 0.3 Log[Abs[I * theta + Log[r]] + 1]),
1 - 1/(1.1 + 5Log[Abs[I * theta + Log[r]] + 1])]]]
Here's the graph of the square-root function on its natural domain:
ParametricPlot3D[{r * Cos[theta], r * Sin[theta],
r /2 * Cos[theta/2]}, {theta, 0, 4Pi}, {r, 0, 3},
PlotPoints → 100, Mesh → None, ColorFunctionScaling → False,
ColorFunction → Function[
{x, y, z, theta, r}, Hue[
Mod[theta/2, 2Pi]/(2Pi),
1/(1 + 0.3 Log[Abs[Sqrt[r]] + 1]),
1 - 1/(1.1 + 5Log[Abs[Sqrt[r]] + 1])]]]
A rational function with one pole of order 1, one pole of order 3, a zero of order 2, and three zeros of order 1.
ComplexGraph[Function[z, (z + 3 + 5I)^2 *
(1/z + I/(z - 5 + 3I)^3)], -10, 10, -10, 10, 200]
f(z) = e^(1/z) has an essential singularity at z=0. From this picture it is not hard to imagine that the function takes on all non-zero values infinitely often in every neighborhood of 0 (Picard's big theorem):
ComplexGraph[Function[z, Exp[1/z]], -1, 1, -1, 1, 200]
The Riemann ζ-function. Note the pole of order 1 at z=1 and the zeros of order 1 on the negative real axis and on the critical line Re(z)=1/2. The function is pretty boring (close to 1) for Re(z)>1, where it was originally defined.
ComplexGraph[Zeta, -40, 20, -40, 40, 400]
The ζ-function on the critical strip 0<Re(z)<1, with the pole and the first two zeros visible. The zeros have real part 1/2, as they should.
Show[ComplexGraph[Zeta, 0, 1, -1, 23, 200], AspectRatio → 5]
According to Voronin's Universality Theorem, the ζ-function on the strip 1/2<Re(z)<1 approximates every holomorphic function without zeros to arbitrary precision. In other words: the strip shows all possible "analytic" color patterns that don't use black or white. Here's a representative segment of the strip.
Show[ComplexGraph[Zeta, 1/2, 1, 103, 109, 200], AspectRatio → 5]
Created December 2007 by Axel Boldt, based on an idea by Jan Homann. All scripts and pictures on this page are in the public domain.