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. :)