Полагаю, было бы целесообразно одновременно переключаться между осями и элементами.
f, axes = plt.subplots(6, 6, figsize=(20, 20), sharex=True)
for ax, feature in zip(axes.flat, df.columns):
sns.distplot(df[feature] , color="skyblue", ax=ax)
Массивы Numpy сглаживаются по строкам, т. Е. Вы получите первые 6 элементов в первом ряду, элементы с 6 по 11 во втором ряду и т. Д.
Если это не то, что вы хотите, вы можете определить индекс для массива осей вручную,
f, axes = plt.subplots(6, 6, figsize=(20, 20), sharex=True)
for i, feature in enumerate(df.columns):
sns.distplot(df[feature] , color="skyblue", ax=axes[i%6, i//6])
например. вышеизложенное будет заполнять столбцы столбцов за столбцом.