Вы можете напрямую работать с экземплярами осей, зацикливая их и работая с ними объектно-ориентированным способом.Сначала определите объекты с 3 осями, а затем зациклите их (вместе с DataFrames) и установите свойства внутри цикла .Ниже приведен соответствующий код
fig, axes = plt.subplots(3, 1, figsize=(8, 5), sharex=True)
dfs = [df1, df2, df3]
for ax, df in zip(axes, dfs):
ax.plot(df1, "-o", markersize=8)
plt.setp(ax.xaxis.get_majorticklabels(), rotation=20)
ax.grid()
plt.gca().fmt_xdata = lambda x: mdates.num2date(x).strftime("%Y-%m-%d %H:%M:%S")
plt.tight_layout()
plt.show()

Делая это по-своему
fig = plt.figure(figsize=(8, 5))
ax1 = plt.subplot(3, 1, 1)
ax2 = plt.subplot(3, 1, 2, sharex=ax1)
ax3 = plt.subplot(3, 1, 3, sharex=ax1)
axes = [ax1, ax2, ax3]
dfs = [df1, df2, df3]
for ax, df in zip(axes, dfs):
ax.plot(df1, "-o", markersize=8)
plt.setp(ax.xaxis.get_majorticklabels(), rotation=20 )
ax.grid()
plt.gca().fmt_xdata = lambda x: mdates.num2date(x).strftime("%Y-%m-%d %H:%M:%S")
plt.tight_layout()
plt.show()