An Axes in Matplotlib is a single plot region inside a Figure. Each Axes has its own x-axis and y-axis (so an Axes object is plural in name despite usually corresponding to one chart), its own coordinate system, its own labels, its own data. A Figure can contain one Axes, several arranged in a grid, or a few arranged in irregular positions.

A single Axes is what most people have in mind when they think of a plot. The reusable idiom that creates a Figure plus one Axes:

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('time (s)')
ax.set_ylabel('voltage (V)')
ax.set_title('Signal')

Methods on the Axes draw onto it: .plot() (lines), .scatter() (markers), .bar(), .hist(), .imshow() (heat maps), .contour(). Setter methods configure it: .set_xlim(), .set_xlabel(), .set_xticks(), .set_title(). Inspector methods read it: .get_xlim(), .get_xticks().

The Figure vs. Axes split matters because almost all content lives on an Axes: the lines you plot, the data you visualize. The Figure handles layout, meaning how multiple Axes are arranged on the page, the overall size, the export to file. Code that confuses the two ends up bouncing between the implicit current-figure semantics of Pyplot and the explicit object semantics of the core library, the most common source of Matplotlib confusion.

For laying out multiple Axes in a grid, plt.subplots(rows, cols) returns a 2D array of Axes. For irregular layouts where some Axes span multiple grid cells, GridSpec is the right tool.