Your problem is not with the axis iteration but plotting with a continuous linestyle a set of points which are not x-axis ordered meaning that the line keeps going left and right, hence adds a lot of noise to the visualization.
Try:
fig, axs = plt.subplots(nrows=2, ncols=2)
for col, ax in zip(df.columns, axs.flatten()):
x_order = x.argsort()
ax.plot(x[x_order],y[x_order])
ax.set_title(col)
plt.subplots_adjust(wspace=.5, hspace=.5)
It seems to work in my environment when reproducing it on your sample
import matplotlib.pyplot as plt
import pandas as pd
s = """Month,Year,Region,Population
Jan,2008,Region.V,2.953926
Feb,2008,Region.V,2.183336
Jan,2009,Region.V,5.23598
Feb,2009,Region.V,3.719351
Jan,2008,Region.VI,3.232928
Feb,2008,Region.VI,2.297784
Jan,2009,Region.VI,6.231395
Feb,2009,Region.VI,7.493449"""
data = [l.split(',') for l in s.splitlines() if l]
df = pd.DataFrame(data[1:], columns=data[0])
df['Population'] = df['Population'].astype(float)
df["MonthYear"] = df["Month"].map(str) + " " + df["Year"].map(str)
df["MonthYear"] = pd.to_datetime(df["MonthYear"], format="%b %Y")
x = df["MonthYear"]
y = df['Population']
fig, axs = plt.subplots(nrows=2, ncols=2)
for col, ax in zip(df.columns, axs.flatten()):
x_order = x.argsort()
ax.plot(x[x_order],y[x_order])
ax.set_title(col)
plt.subplots_adjust(wspace=.5, hspace=.5)
fig.tight_layout()
plt.show()
which produces
