使用列作为y轴值从数据框中生成多个图(遍历数据框)

时间:2018-09-18 16:16:17

标签: python loops matplotlib seaborn

我有一个如下数据框:

https://i.stack.imgur.com/OKKrz.png

两个类别变量是冲动性治疗,以及多个因变量( prot_width 等。)。

我设法制作了一个箱形图,该框形图通过冲动处理来对因变量进行建模;

sns.boxplot(x='treatment', y='prot_width', hue='impulsivity',
            palette=['b','r'], data=data)
sns.despine(offset=10, trim=True)

产生下面的图;

https://i.stack.imgur.com/YfXn1.png

现在我要做的是为每个因变量生成完全相同的图。我想遍历每个重命名y轴的因变量列。

我已经搜索了循环等。但是无法弄清楚如何调用列,更重要的是如何在循环中更改y轴。

1 个答案:

答案 0 :(得分:1)

使用DataFrame.columns(一个可迭代的对象)在数字数据列中循环,然后将迭代器变量(此处为 col )传递到boxplot的 y 参数中

for col in data.columns[4:len(data.columns)]:
    sns.boxplot(x='treatment', y=col, hue='impulsivity',
                palette=['b','r'], data=data)
    sns.despine(offset=10, trim=True)

    plt.show()

对于所有数字列,也可以使用select_dtypes

for col in data.select_dtypes(['float', 'int']).columns:
    ...

甚至filter都可以忽略非数字列:

for col in data.filter(regex="[^(subject|protrusion|impulsivity|treatment)]").columns:
    ...

使用随机数据进行演示:

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

np.random.seed(9192018)
demo_df = pd.DataFrame({'tool': np.random.choice(['pandas', 'r', 'julia', 'sas', 'stata', 'spss'],500),
                        'os': np.random.choice(['windows', 'mac', 'linux'],500), 
                        'prot_width': np.random.randn(500)*100,
                        'prot_length': np.random.uniform(0,1,500),                   
                        'prot_lwr': np.random.randint(100, size=500)
                       }, columns=['tool', 'os', 'prot_width', 'prot_length', 'prot_lwr'])

for col in demo_df.columns[2:len(demo_df.columns)]:
    sns.boxplot(x='tool', y=col, hue='os', palette=['b','r'], data=demo_df)
    sns.despine(offset=10, trim=True)

    plt.legend(loc='center', ncol = 3, bbox_to_anchor=(0.5, 1.10))
    plt.show()
    plt.clf()

plt.close()

Plot Output