It sounds like what you want is subtitles ... What you are doing now doesn't make much sense (or I'm really confused by your piece of code, anyway ...).
Try something else like this:
import matplotlib.pyplot as plt import numpy as np fig, axes = plt.subplots(nrows=3) colors = ('k', 'r', 'b') for ax, color in zip(axes, colors): data = np.random.random(1) * np.random.random(10) ax.plot(data, marker='o', linestyle='none', color=color) plt.show()

Edit:
If you don't want to use subheadings, your code snippet makes more sense.
You are trying to add three axes directly above each other. Matplotlib recognizes that there is already a subtitle in that exactly the size and location in the drawing, and therefore it returns the same axis object every time. In other words, if you look at your ax list, you will see that it is still the same object.
If you really want to do this, you will need to reset fig._seen to an empty dict each time you add axes. You probably really don't want to do this.
Instead of putting three independent graphics on top of each other, take a look at using twinx .
eg.
import matplotlib.pyplot as plt import numpy as np

Joe Kington Oct 12 2018-11-11T00: 00Z
source share