"""
 Aemo of plotting complex functions in python.

 Jim M | Feb 2011 | GPL
"""
# Plotting functions ; see the example below
# and http://matplotlib.sourceforge.net/
from matplotlib.pyplot import plot, legend

# Complex math (cmath) python functions ;
# see  see http://docs.python.org/library/cmath.html
from cmath import sin, cos, exp, pi, log, polar, rect, phase, sqrt

# Note that python represents imaginary numbers like "3i" as "3j",
# where "j" meaning "sqrt(-1) must be preceded by a number,
# so "sqrt(-1)" alone would in python be "1j".
#
#     (3,4) complex rectangular form:     z = 3 + 4j
#     (x,y) complex rectangular form :    z = x + y * 1j
#     polar form :                        z = r * exp(1j * theta)
#     abs(z)   is length of complex number = r
#     phase(z) is angle of complex number = theta
#     z.real   is real part
#     z.imag   is imaginary part
#
# abs() is a python built-in; as are complex numbers themselves.
# But the other functions needed to be imported in their complex versions.
# The numeric constant pi can be imported from math or cmath.

# Remember that
# 1. lambda(x: ...) is an anyonymous function of x, e.g. lambda(x: 2*x+1)
# 2. map(f, [a, b, c, ...])  # returns [f(a), f(b), f(c), ...]


# == So here are a few utility functions for multiplying scalars and vectors.

# a scalar times a vector returns a vector
def scale_vector(scale, vector):
  result = [0]*len(vector)
  for i in range(len(result)):
    result[i] = scale * vector[i]
  return result

# dot product of two vectors = sum(x[0]*y[0] + ... + x[n-1]*y[n-1])
def vector_dot(vector1, vector2):
  result = 0
  for i in range(len(vector1)):
    result += vector1[i] * vector2[i]
  return result

# return real part of a vector
def real_vector(vector):
  return map(lambda x: x.real, vector)

# return imaginary part of a vector
def imag_vector(vector):
  return map(lambda x: x.imag, vector)

# == And here's the demo.

def main():
  # Generate numbers around the complex unit circle.
  # (These are the same numbers that show up in the Fourier Transform.)
  N = 128
  theta = scale_vector(2*pi/N, range(N))
  exp_theta = map(lambda x: exp(1j * x), theta)

  real_part = real_vector(exp_theta)
  imag_part = imag_vector(exp_theta)

  # Display a window with a plot of real, imag
  plot(theta, real_part, '-', label='real')
  plot(theta, imag_part, '--', label='imag')
  legend(loc='lower left', title='exp(i theta)')

  # And wait until the user is done with it.
  done = raw_input("done? ")

if __name__ == "__main__":
  main()

syntax highlighted by Code2HTML, v. 0.93pm6