%matplotlib inline
fig, axes = plt.subplots(nrows=2, ncols=4)
m = 0
l = 0
for i in k: 
    if l == 4 and m==0:
        m+=1
        l = 0
    data1[i].plot(kind = 'box', ax=axes[m,l], figsize = (12,5))
    l+=1
This outputs subplots as desired.

But when trying to achieve it through seaborn, subplots are stacked close to each other, how do I change size of each subplot?
fig, axes = plt.subplots(nrows=2, ncols=4)
m = 0
l = 0
plt.figure(figsize=(12,5))
for i in k: 
    if l == 4 and m==0:
        m+=1
        l = 0
    sns.boxplot(x= data1[i],  orient='v' , ax=axes[m,l])
    l+=1

Your call to plt.figure(figsize=(12,5)) is creating a new empty figure different from your already declared fig from the first step. Set the figsize in your call to plt.subplots. It defaults to (6,4) in your plot since you did not set it. You already created your figure and assigned to variable fig. If you wanted to act on that figure you should have done fig.set_size_inches(12, 5) instead to change the size.
You can then simply call fig.tight_layout() to get the plot fitted nicely.
Also, there is a much easier way to iterate through axes by using flatten on your array of axes objects. I am also using data directly from seaborn itself.
# I first grab some data from seaborn and make an extra column so that there
# are exactly 8 columns for our 8 axes
data = sns.load_dataset('car_crashes')
data = data.drop('abbrev', axis=1)
data['total2'] = data['total'] * 2
# Set figsize here
fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(12,5))
# if you didn't set the figsize above you can do the following
# fig.set_size_inches(12, 5)
# flatten axes for easy iterating
for i, ax in enumerate(axes.flatten()):
    sns.boxplot(x= data.iloc[:, i],  orient='v' , ax=ax)
fig.tight_layout()

Without the tight_layout the plots are slightly smashed together. See below.

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With