使用循环创建Matplotlib子图,该循环迭代来自不同Pandas Dataframes的列

时间:2017-10-04 19:33:21

标签: python pandas dataframe subplot

好的,所以我从昨天起就一直试图解决这个问题,但找不到解决办法。

我为12个不同的实验数据创建了12个pandas Dataframes(名为exp_1 - exp_12),列名在所有Dataframe中都是相同的。我想创建一个包含12个子图(12x4)的图,每行有4个图。

到目前为止,这么好。绘图工作正常,我目前正在使用此代码(我将其缩短为4个图表):

fig, axs = plt.subplots(nrows = 12, ncols=4, figsize = (15,27))
sns.regplot('MecA_SP', 'MecA_MP', data=exp_3, color ='blue', ax=axs[0,0])
sns.regplot('blaOXA_SP', 'blaOXA_MP', color ='lime', data=exp_3, 
ax=axs[0,1])
sns.regplot('Aph3_SP', 'Aph3_MP', data=exp_3, color = 'deeppink', 
ax=axs[0,2])
sns.boxplot(data=exp_3, orient ='h', color ='darkviolet', ax=axs[0,3])
fig.tight_layout()
plt.show()

但是我试图通过使用循环来创建这些子图,这样我就不必为每个Dataframe手动输入每个样本名称。现在这就是我所拥有的:

 fig, axs = plt.subplots(nrows = 12, ncols=4, figsize = (14,5))
exps = {0: 'exp_1',1: 'exp_2',2: 'exp_3',3: 'exp_4',4: 'exp_5',5: 'exp_6', 
6:'exp_7',7: 'exp_8', 8:'exp_9',9: 'exp_10',10: 'exp_11',11: 'exp_12'}
for x in exps :
    sns.regplot('MecA_SP', 'MecA_MP', data=x, color ='blue', ax=axs[exps[x], 
    0])
    sns.regplot('blaOXA_SP', 'blaOXA_MP', color ='lime', data=x, 
    ax=axs[exps[x], 1])
    sns.regplot('Aph3_SP', 'Aph3_MP', data=x, color = 'deeppink', 
    ax=axs[exps[x], 2])
    sns.boxplot(data=x, orient ='h', color ='darkviolet', ax=axs[exps[x],3])
fig.tight_layout()
plt.show()

如果我不使用循环,这就是我的情节,但是只需手动编写整个内容: enter image description here

有谁知道如何解决这个问题?我会对任何建议感到高兴,所以提前谢谢

1 个答案:

答案 0 :(得分:1)

只需将数据框保存在列表中而不是数据框名称字典中,然后迭代创建子图。甚至使用enumerate来获取绘图 ax 位置的循环计数。

exps = [exp_1, exp_2, exp_3, exp_4, exp_5, exp_6
        exp_7, exp_8, exp_9, exp_10, exp_11, exp_12]

fig, axs = plt.subplots(nrows = 12, ncols=4, figsize = (14,5))

for i, x in enumerate(exps):
    sns.regplot('MecA_SP', 'MecA_MP', data=x, color='blue', ax=axs[i, 0])
    sns.regplot('blaOXA_SP', 'blaOXA_MP', data=x, color='lime', ax=axs[i, 1])
    sns.regplot('Aph3_SP', 'Aph3_MP', data=x, color='deeppink', ax=axs[i, 2])
    sns.boxplot(orient='h', data=x, color='darkviolet', ax=axs[i, 3])

fig.tight_layout()
plt.show()
plt.clf()
plt.close()