Jim Mahoney | MIT License | Jan 2019 | cs.marlboro.college
# My standard numerical work imports.
import matplotlib.pyplot as plt
import numpy as np
from numpy import *
%matplotlib inline
Here's an example of how to make a labeled plot of a curve and some points.
# Points are stored as two arrays, [x1, x2, x3, ...] and [y1, y2, y3, ...].
points_x = [1.5, 3.2, 5.1]
points_y = [-0.5, 0.2, 0.9]
# Curves are just closely spaces points.
x = np.linspace(0, 2*pi, 200)  # 200 points from 0 to 2*pi ; a numpy.ndarray
y = sin(x)                     # numpy's sin() : take the sine of each
# Set up the plot with successive commands.
figure = plt.figure(dpi=220, figsize=(3, 2))   # dots_per_inch and (width, height) in inches
axis = figure.add_subplot(111)                 # 111 indicates (rows,cols,number) i.e. 1x1 #1 .
axis.set(xlabel="the x axis", ylabel="sideways", title="not a plot of $\pi$")
axis.set_xlim((0, 2*pi))  # i.e. xlimits=(0,10)
axis.set_ylim((-1.2, 1.2))    # 
axis.plot(points_x, points_y, marker="o", color="blue", linestyle="none")
axis.plot(x, y, color="green")
plt.show()
# See all the details at
# https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.plot.html?highlight=plot#matplotlib.axes.Axes.plot
Generate a bunch of fibonacci values and plot 'em on a log scale.
n = 100                # how many fibonnaci values
fib = [None] * n       # set up an array to hold 'em.
fib[0] = 1
fib[1] = 1
for i in range(2, n):
    fib[i] = fib[i-1] + fib[i-2]
str(fib)
# Here's what they look like.
figure = plt.figure(dpi=220, figsize=(3, 2))   # dots_per_inch and (width, height) in inches
axis = figure.add_subplot(111)                 # 111 indicates (rows,cols,number) i.e. 1x1 #1 .
axis.set(xlabel="n", ylabel="fib[n]", title="Fibonacci")
axis.plot(range(n), fib, marker=".", markersize=1.0, color="blue", linestyle="none")
plt.show()
# Much more revealing is to take the log() of the y values
# .. or to plot with log scaling, which amounts to the same thing visually.
# google "matplotlib log"
figure = plt.figure(dpi=220, figsize=(3, 2))   # dots_per_inch and (width, height) in inches
axis = figure.add_subplot(111)                 # 111 indicates (rows,cols,number) i.e. 1x1 #1 .
axis.set(xlabel="n", ylabel="fib[n]", title="Fibonacci")
axis.plot(range(n), fib, marker=".", markersize=1.0, color="blue", linestyle="none")
plt.yscale('log')
plt.show()
So on a log scale, the Fibonacci series is a straight line ... which means that it is a power law, approximately fib[n] ~ $a * b^n$ for some constants $a$ and $b$.
It turns out that $b$ is the golden ratio $k = 1.62... $
ns = np.array(range(1,n))  # The ns should be a numpy array for the arithmetic below to work.
a = 0.7
b = 1.62
ys = a * b ** ns           # The power law that we're approximating.
figure = plt.figure(dpi=220, figsize=(5, 3))   # dots_per_inch and (width, height) in inches
axis = figure.add_subplot(111)                 # 111 indicates (rows,cols,number) i.e. 1x1 #1 .
axis.set(xlabel="n", ylabel="fib[n]", title="Fibonacci")
axis.plot(range(n), fib, marker=".", markersize=1.0, color="blue", linestyle="none", label="fib[n]")
axis.plot(ns, ys, color="red", linewidth=0.5, linestyle="dashed", label="${}*{}^n$".format(a,b))
axis.legend()
plt.yscale('log')
plt.show()
For a really good time we can even use xkcd style !
with plt.xkcd():
    figure = plt.figure(dpi=220, figsize=(5, 3))   # dots_per_inch and (width, height) in inches
    axis = figure.add_subplot(111)                 # 111 indicates (rows,cols,number) i.e. 1x1 #1 .
    axis.set(xlabel="n", ylabel="fib[n]", title="Fibonacci?")
    axis.plot(range(n), fib, marker=".", markersize=1.0, color="blue", linestyle="none", label="fib[n]")
    axis.plot(ns, ys, color="red", linewidth=0.5, linestyle="dashed", label="${}*{}^n$".format(a,b))
    axis.legend()
    plt.yscale('log')
    plt.show()
OK, so now we're having fun. :)