Jones Matrices
Scott Prahl
Feb 2026
Basic examples of polarizing elements (polarizers and retarders) present in the pypolar.jones module.
This module and most optics texts (including Fowles) define angles based on the receiver point-of-view. This means that the electric field is viewed against the direction of propagation or on looking into the source. Complete details of the assumptions used by pypolar can be found in Jupyter notebook on Conventions
[1]:
%config InlineBackend.figure_format = 'retina'
import sys
import numpy as np
if sys.platform == "emscripten":
import micropip
await micropip.install("pypolar")
from pypolar import jones
Jones matrices for linear polarizers
These are the matrix operators needed for a theoretically perfect linear polarizer. The polarizer is normal to the beam and it rotated around the axis of the beam. The angle is measured from the horizontal plane.
Matches Kliger Appendix B, page 281. These match Wikipedia because there are no complex valued in the matrices.
[2]:
for theta in [0, 45, 90, -45]:
print("Jones Matrix for linear polarizer oriented at %.1f°" % theta)
L = jones.op_linear_polarizer(np.radians(theta))
print(np.round(L, 5))
Jones Matrix for linear polarizer oriented at 0.0°
[[1. 0.]
[0. 0.]]
Jones Matrix for linear polarizer oriented at 45.0°
[[0.5 0.5]
[0.5 0.5]]
Jones Matrix for linear polarizer oriented at 90.0°
[[0. 0.]
[0. 1.]]
Jones Matrix for linear polarizer oriented at -45.0°
[[ 0.5 -0.5]
[-0.5 0.5]]
Quarter-Wave Plates
These match those on Kliger page 282, \(\delta=90\)° and rotation angles \(\rho\)
[3]:
for theta in [0, 45, 90, -45]:
print("Jones Matrix for QWP with fast axis at %.1f°" % theta)
L = jones.op_quarter_wave_plate(np.radians(theta))
print(np.round(L, 3))
print()
Jones Matrix for QWP with fast axis at 0.0°
[[0.707+0.707j 0. +0.j ]
[0. +0.j 0.707-0.707j]]
Jones Matrix for QWP with fast axis at 45.0°
[[0.707+0.j 0. +0.707j]
[0. +0.707j 0.707-0.j ]]
Jones Matrix for QWP with fast axis at 90.0°
[[0.707-0.707j 0. +0.j ]
[0. +0.j 0.707+0.707j]]
Jones Matrix for QWP with fast axis at -45.0°
[[ 0.707+0.j -0. -0.707j]
[-0. -0.707j 0.707-0.j ]]
Here are the matrices from Fowles Table 2.1 page 35
[4]:
jones.use_alternate_convention(True)
for theta in [0, 45, 90, -45]:
print("Jones Matrix for QWP with fast axis at %.1f°" % theta)
L = jones.op_quarter_wave_plate(np.radians(theta))
print(np.round(L, 3))
print()
norm = L[0, 0]
print("... and when scaled by so top left element is unity")
print(np.round(L / norm, 3))
print()
# restore default setting
jones.use_alternate_convention(False)
Jones Matrix for QWP with fast axis at 0.0°
[[ 0.707-0.707j -0. -0.j ]
[-0. -0.j 0.707+0.707j]]
... and when scaled by so top left element is unity
[[1.+0.j 0.-0.j]
[0.-0.j 0.+1.j]]
Jones Matrix for QWP with fast axis at 45.0°
[[ 0.707-0.j -0. +0.707j]
[-0. +0.707j 0.707+0.j ]]
... and when scaled by so top left element is unity
[[ 1.-0.j -0.+1.j]
[-0.+1.j 1.+0.j]]
Jones Matrix for QWP with fast axis at 90.0°
[[ 0.707+0.707j -0. +0.j ]
[-0. +0.j 0.707-0.707j]]
... and when scaled by so top left element is unity
[[1.-0.j 0.+0.j]
[0.+0.j 0.-1.j]]
Jones Matrix for QWP with fast axis at -45.0°
[[0.707-0.j 0. -0.707j]
[0. -0.707j 0.707+0.j ]]
... and when scaled by so top left element is unity
[[1.-0.j 0.-1.j]
[0.-1.j 1.+0.j]]
Here are the matrices from Wikipedia
[5]:
jones.use_alternate_convention(True)
for theta in [0, 45, 90, -45]:
print("Jones Matrix for QWP with fast axis at %.1f°" % theta)
L = jones.op_quarter_wave_plate(np.radians(theta))
print(np.round(L, 3))
print()
norm = L[0, 0]
print("... and when scaled by so top left element is unity")
print(np.round(L / norm, 3))
print()
jones.use_alternate_convention(False)
Jones Matrix for QWP with fast axis at 0.0°
[[ 0.707-0.707j -0. -0.j ]
[-0. -0.j 0.707+0.707j]]
... and when scaled by so top left element is unity
[[1.+0.j 0.-0.j]
[0.-0.j 0.+1.j]]
Jones Matrix for QWP with fast axis at 45.0°
[[ 0.707-0.j -0. +0.707j]
[-0. +0.707j 0.707+0.j ]]
... and when scaled by so top left element is unity
[[ 1.-0.j -0.+1.j]
[-0.+1.j 1.+0.j]]
Jones Matrix for QWP with fast axis at 90.0°
[[ 0.707+0.707j -0. +0.j ]
[-0. +0.j 0.707-0.707j]]
... and when scaled by so top left element is unity
[[1.-0.j 0.+0.j]
[0.+0.j 0.-1.j]]
Jones Matrix for QWP with fast axis at -45.0°
[[0.707-0.j 0. -0.707j]
[0. -0.707j 0.707+0.j ]]
... and when scaled by so top left element is unity
[[1.-0.j 0.-1.j]
[0.-1.j 1.+0.j]]
Half-Wave Plates
Here, once again, both conventions match because there are no imaginary numbers involved
[6]:
for theta in [0, 90]:
print("Jones Matrix for HWP with fast axis at %.1f°" % theta)
L = jones.op_half_wave_plate(np.radians(theta))
print(np.round(L, 3))
norm = L[0, 0]
print("... and when scaled by so top left element is unity")
print(np.round(L / norm, 3))
print()
for theta in [45, -45]:
print("Jones Matrix for HWP with fast axis at %.1f°" % theta)
L = jones.op_half_wave_plate(np.radians(theta))
print(np.round(L, 3))
norm = L[0, 1]
print("... and when scaled by so top right element is unity")
print(np.round(L / norm, 3))
print()
Jones Matrix for HWP with fast axis at 0.0°
[[0.+1.j 0.+0.j]
[0.+0.j 0.-1.j]]
... and when scaled by so top left element is unity
[[ 1.+0.j 0.+0.j]
[ 0.+0.j -1.-0.j]]
Jones Matrix for HWP with fast axis at 90.0°
[[0.-1.j 0.+0.j]
[0.+0.j 0.+1.j]]
... and when scaled by so top left element is unity
[[ 1.-0.j -0.+0.j]
[-0.+0.j -1.+0.j]]
Jones Matrix for HWP with fast axis at 45.0°
[[0.+0.j 0.+1.j]
[0.+1.j 0.-0.j]]
... and when scaled by so top right element is unity
[[ 0.-0.j 1.+0.j]
[ 1.+0.j -0.-0.j]]
Jones Matrix for HWP with fast axis at -45.0°
[[ 0.+0.j -0.-1.j]
[-0.-1.j 0.-0.j]]
... and when scaled by so top right element is unity
[[-0.+0.j 1.-0.j]
[ 1.-0.j 0.+0.j]]
[ ]: