Koala Speeds Solution¶
import matplotlib.pyplot as plt
# Instantiate a figure with a single Axes
fig, ax = plt.subplots(figsize=(8,6), layout='tight')
# Make a scatter plot
ax.scatter(x=weights, y=speeds, s=ages**2, marker='x')
# Plot regression line
xlims = np.array(ax.get_xlim())
ax.plot(xlims, m * xlims + b, c='r')
# Set title & labels
ax.set_title('Speed vs weight of adult koalas')
ax.set_xlabel('weight')
ax.set_ylabel('speed')
# Insert equation in the upper right corner
ax.text(
x=0.98,
y=0.98,
s=f'speed = {m}*weight + {b}',
ha='right',
va='top',
transform=ax.transAxes
)
Explanation¶
-
Make a figure with a single Axes.
import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(8,6), layout='tight')
plt.subplots()
makes a figure with one Axes. (See matplotlib.pyplot.subplots.)figsize=(8,6)
sets the figure dimensions as 8 in. by 6 in. (See thefigsize
parameter of matplotlib.figure.)layout='tight'
"adjusts the subplot parameters so that decorations like tick labels, axis labels and titles have enough space". (See thelayout
parameter of matplotlib.figure.)
-
Make a scatter plot.
ax.scatter( x=weights, # set x as the weights y=speeds, # set y as the speeds s=ages**2, # set ages**2 as the marker sizes marker='x' # set the marker style as "x" )
-
Plot the regression line
xlims = np.array(ax.get_xlim()) ax.plot(xlims, m * xlims + b, c='r')
The strategy here is to plot a line between two points: (x1, y1) to (x2, y2). We want the x values to span the x limits of
ax
, which we can fetch withxlims = np.array(ax.get_xlim()) print(xlims) # [ 9.55113043 20.10128969]
Then we calculate the corresponding y values.
print(m * xlims + b) # [6.76733044 5.18480655]
Passing these into
ax.plot()
plots a line between them, by default.ax.plot(xlims, m * xlims + b, c='r') # (1)!
c='r'
makes the line color red.
-
Set title & labels.
5. Insert the equation in the upper right corner.ax.set_title('Speed vs weight of adult koalas') ax.set_xlabel('weight') ax.set_ylabel('speed')
ax.text( x=0.98, # (1)! y=0.98, # (2)! s=f'speed = {m}*weight + {b}', # (3)! ha='right', # (4)! va='top', # (5)! transform=ax.transAxes # (6)! )
- Anchor the text at x position 0.98 (near the right edge)
- Anchor the text at y position 0.98 (near the top edge)
- Use an f-string to generate the text representing the equation "speed = m*weight + b"
- horizontally align the text to the right (so the far right of the text lands at position x = 0.98)
- vertically align the text to the top (so the top of the text lands at position y = 0.98)
- Apply a transformation that lets us input values in the range [0, 1].
Here we use
ax.text()
to add text onto the Axes. Our trick to placing the text in the top right is to usetransform=ax.transAxes
which allows us to specifyx
andy
in the range [0, 1] where 0 is the left/bottom edge and 1 is the right/top edge.