【问题标题】:How to plot multiple CSV files with separate plots for each category如何绘制多个 CSV 文件,每个类别都有单独的图
【发布时间】:2021-09-08 10:03:20
【问题描述】:

我有 3 个 CSV 文件。所有文件都包含一列 (column name: Method)。每个 CSV 文件中包含 4 种不同类型的方法。

我可以创建一个plot,其中包含 1 个 CSV 文件的所有 4 种方法。代码如下

ROOT = Path(__file__).resolve().parent
CSVS = [
    ROOT / "CSV_1.csv",
    ROOT / "CSV_2.csv",
    ROOT / "CSV_3.csv",
]

def accuracy_plot():
    for csv in CSVS:
        error_kind = csv.stem[: csv.stem.find("_")]
        data = pd.read_csv(csv)
        plt.figure(figsize=(8, 8))
        sns.scatterplot(x="EC", y="MAE", data=data, hue="Method")
        plt.title("MAE vs EC")
        plt.xlabel("MAE")
        plt.ylabel("EC")
        plt.savefig(error_kind + ".png")

剧情如下图

现在,我想为来自所有 CSV 文件的一种方法和数据创建一个图。更具体地说,我想要一个只显示一种方法信息但来自所有 3 个 CSV 文件的数据的图。在这个图中,我需要使用不同的符号(+、-、*)来识别来自不同数据集的数据。或者我们也可以给它们不同的颜色。最终,我将为 4 种不同的方法绘制 4 种不同的图。

你能告诉我我该怎么做这份工作吗?我使用了seaborn,但如果您想使用matplotlib,欢迎您。

【问题讨论】:

    标签: python python-3.x pandas matplotlib seaborn


    【解决方案1】:

    选项 1

    1. 我能想到的最简单的方法是将所有文件合并到一个数据帧中
    2. seaborn.relplot 绘制数据框
    • 此选项创建单个 FacetGrid
    # create the dataframe from all the csv files
    df = pd.concat([pd.read_csv(csv).assign(file=csv.stem) for csv in CSVS]).reset_index(drop=True)
    
    # create the plots
    p = sns.relplot(data=df, kind='scatter', col='Method', col_wrap=2, x='EC', y='MAE', hue='file', height=4)
    
    # save
    p.savefig("output.png")
    

    选项 2

    • 根据编辑中的要求,此选项将为每个 method 创建单独的图。
    1. 使用.assign 向数据框添加一列以标识数据来自哪个文件。使用.assign,而不是for循环,来自Simon Bowly
    2. 为给定的method 选择data,并使用hue='file'
    3. 设置hue_order,以确保在每个绘图中分配相同的颜色。
    import seaborn as sns
    import pandas as pd
    import matpltlib.pyplot as plt
    
    # create a single dataframe
    df = pd.concat([pd.read_csv(csv).assign(file=csv.stem) for csv in CSVS]).reset_index(drop=True)
    
    # plot
    for method in df.Method.unique():
        # select data only for the current method
        data = df[df.Method.eq(method)]
        sns.scatterplot(data=data, x='EC', y='MAE', hue='file', hue_order=sorted(df.file.unique()))
        plt.title(method)
        plt.xlim(0, 1)
        plt.savefig(f'{method}.png')
        plt.show() or plt.clf()  # to clear the plot between each loop; pick one
    

    样本数据

    import numpy as np
    import pandas as pd
    
    def data(method, loc):
        n = 100
        v = np.random.normal(loc=loc, scale=0.01, size=(n,))
        m = np.random.uniform(low=0.0, high=120.0, size=(n,))
        f = np.random.choice(['csv_1', 'csv_2', 'csv_3'], size=(n,))
        met = [method] * n
        d = {'EC': v, 'MAE': m, 'Method': met, 'file': f}
        return pd.DataFrame(d)
    
    
    samples = [('method_1', 0.05), ('method_1', 0.12),
               ('method_2', 0.053), ('method_2', 0.11), ('method_2', 0.21),
               ('method_3', 0.63), ('method_3', 0.72), ('method_3', 0.9),
               ('method_4', 0.7), ('method_4', 0.8), ('method_4', 0.9)]
    
    np.random.seed(1)
    df = pd.concat([data(method, loc) for (method, loc) in samples]).reset_index(drop=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      相关资源
      最近更新 更多