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 reason the Figure vs. Axes split matters is that almost all content lives on an Axes — the lines you plot, the data you visualize. The Figure handles layout — 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, which is 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.