Во-первых, вы должны переместить объявление fig, axes
вне цикла, чтобы не создавать новую фигуру для каждого столбца.
Кроме того, цикл по for i,j in row, column:
не работает и создаст еще один цикл внутри вашего цикла по столбцам, который вам не нужен.
Таким образом, вместо того, чтобы указывать строки и столбцы, просто вычислите, какими должны быть i и j в цикле for z in df
. Использование x в качестве кадра данных, а затем x в качестве индекса df
не имеет смысла. В вашей функции вы даже не указали df
, вы просто не получите сообщение об ошибке, потому что функция использует df
из внешней области, что не очень хорошая практика.
Кроме того, возвращение plt
на самом деле не способ сделать это, поскольку это означает модуль pyplot. Вы можете просто вызвать plt.show()
в своей функции, так как вы, кажется, не назначаете свою функцию чему-либо, нет необходимости возвращать значение.
Итак, в целом работающий код:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# make sample dataframe
dicts = {}
keys = range(12)
for i in keys:
dicts["x%s"%i] = list(np.random.randint(40, size=20))
dicts["y12"] = list(range(1,21))
df_sample = pd.DataFrame(dicts)
# function to plot your dataframe
def plot_df_scatter_columns(df):
fig, axes = plt.subplots(3,4, figsize = (12, 8))
# initialize i and j
i=0
j=0
# loop over df.iloc[:, :-1] instead of df
# to leave out last column in loop
for z in df.iloc[:, :-1]:
axes[i, j].scatter(df[z], df['y12'])
axes[i, j].set_title(z + 'vs. y12')
# calculate i and j on the fly during loop over df
j += 1
if j > 3:
j=0
i += 1
plt.show()
plot_df_scatter_columns(df_sample)