Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to plot complex numbers (Argand Diagram) using matplotlib

Tags:

I'd like to create an Argand Diagram from a set of complex numbers using matplotlib.

  • Are there any pre-built functions to help me do this?

  • Can anyone recommend an approach?

enter image description here

Image by LeonardoG, CC-SA-3.0

like image 205
atomh33ls Avatar asked Jul 03 '13 10:07

atomh33ls


2 Answers

I'm not sure exactly what you're after here...you have a set of complex numbers, and want to map them to the plane by using their real part as the x coordinate and the imaginary part as y?

If so you can get the real part of any python imaginary number with number.real and the imaginary part with number.imag. If you're using numpy, it also provides a set of helper functions numpy.real and numpy.imag etc. which work on numpy arrays.

So for instance if you had an array of complex numbers stored something like this:

In [13]: a = n.arange(5) + 1j*n.arange(6,11)

In [14]: a
Out[14]: array([ 0. +6.j,  1. +7.j,  2. +8.j,  3. +9.j,  4.+10.j])

...you can just do

In [15]: fig,ax = subplots()

In [16]: ax.scatter(a.real,a.imag)

This plots dots on an argand diagram for each point.

edit: For the plotting part, you must of course have imported matplotlib.pyplot via from matplotlib.pyplot import * or (as I did) use the ipython shell in pylab mode.

like image 172
inclement Avatar answered Sep 28 '22 10:09

inclement


To follow up @inclement's answer; the following function produces an argand plot that is centred around 0,0 and scaled to the maximum absolute value in the set of complex numbers.

I used the plot function and specified solid lines from (0,0). These can be removed by replacing ro- with ro.

def argand(a):
    import matplotlib.pyplot as plt
    import numpy as np
    for x in range(len(a)):
        plt.plot([0,a[x].real],[0,a[x].imag],'ro-',label='python')
    limit=np.max(np.ceil(np.absolute(a))) # set limits for axis
    plt.xlim((-limit,limit))
    plt.ylim((-limit,limit))
    plt.ylabel('Imaginary')
    plt.xlabel('Real')
    plt.show()

For example:

>>> a = n.arange(5) + 1j*n.arange(6,11)
>>> from argand import argand
>>> argand(a)

produces: argand function output graph

EDIT:

I have just realised there is also a polar plot function:

for x in a:
    plt.polar([0,angle(x)],[0,abs(x)],marker='o')

enter image description here

like image 38
atomh33ls Avatar answered Sep 28 '22 10:09

atomh33ls