【问题标题】:Producing multiple plots from data-frame using columns as y-axis values (looping through dataframe)使用列作为 y 轴值从数据框生成多个图(循环通过数据框)
【发布时间】:2019-02-22 17:41:09
【问题描述】:

我有一个如下的数据框:

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

我已经设法生成了一个箱线图,该箱线图通过冲动性治疗对因变量进行建模;

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

生成下图;

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

我已经搜索了 for 循环等,但不知道如何调用列,更重要的是如何在循环期间更改 y 轴。

【问题讨论】:

  • 简单地循环通过data.columns[4:len(data.columns)]这是一个列表并将迭代器变量传递给boxploty参数。
  • 感谢您的回复。我对 python 比较陌生,并且在“传递迭代器变量”方面仍然有些困难。这是否意味着我必须设置一个新的“for”语句来定义列标题(带有 +1 索引语句) - 不确定我是否在这里混淆了这个问题。任何有关示例的帮助都会很棒。

标签: python loops matplotlib seaborn


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2020-07-01
    • 2017-10-28
    • 2018-05-25
    相关资源
    最近更新 更多