2

首先,我想明确一点,我不是 Python 专家,但仍在学习如何使用 pandas。我浏览了较旧的帖子,但找不到合适的答案。

我一直在尝试编写 92 份合约的数据分析代码。对于它们中的每一个,我想绘制一个特定的分析(每次获取相同数据帧的一些列)并将每个分析保存在不同的文件夹中(分析 1、分析 2、...)。

到目前为止,我面临着许多困难。因此,在关注要绘制的内容之前,我想了解如何编写每次将每个绘图保存在不同的 .png 文件中的代码。我尝试过的代码似乎没有保存任何内容,因为当我转到该文件夹​​时它是空的。

感谢waykiki 的帮助,我已经能够更新我的代码。现在我知道如何创建与我生成的分析一样多的文件夹。然而,我似乎不明白如何对每次分析的 92 个图的绘图进行编码。我的代码现在看起来像这样:

import pandas as pd
import matplotlib.pyplot as plt
import os

# Folder in which I want the analyses to be saved
URL5 = r"C:\Users\A\AppData\Local\Programs\Python\Python39"
# 1 graph per ID_Contrat (thus, 92 graphs)
groups = outer_merged_df.groupby("ID_Contrat") #where outer_merged_df is my dataframe
# How to name each plot.
List_ID_Contrat = outer_merged_df["ID_Contrat"].tolist()

def create_plot(file_name, x, y):
    # Create your plot. It is my understanding that here I should just give the x and the y I want to plot.
    fig = plt.figure()
    plt.plot(x, y, color = "red", kind = "line", legend = "true", linewidth = 2)
    plt.savefig(file_name)
    plt.show()

def main():
    # must be full-path. 
    parent_folder = URL5
    # move to parent directory
    os.chdir(parent_folder)
    # I want file_name to be different for each graph
    extension = ".png"
    # 5 = how many analyses I want to do
    for i in range(5):
        for name in List_ID_Contrat :
            file_name = "Analyse" + str[i+1] "{}" + extension.format(name) # I want file_name to be different for each graph and looking like "Analyse i Contrat XX"
        # Create a new folder
        folder_name = 'Analysis ' + str(i+1)
        os.mkdir(folder_name)
        full_file_name = folder_name + '/' + file_name
        x = np.linspace(1,100,100)
        y = np.random.random(100)
        create_plot(full_file_name, x, y)
        print("plot "+ savefile +" finished".format(name))
        
if __name__ == "__main__":
    main()

然而,当我运行我的代码时,它不再绘制 92 个图,也不想再创建文件夹(尽管它确实使用了 Waykiki 的方法)。在第一轮中 for 循环被破坏(我只得到文件夹“分析 1”)我收到错误消息:

AttributeError: 'Line2D' object has no property 'kind'

您能否向我解释一下如何保存图表?我迷路了..

谢谢

4

3 回答 3

2

我认为您的方法是正确的,因为您将问题分为两个步骤:

1.) 完成技术细节(创建、组织和浏览文件夹和数据)。

2.) 实际创建/绘制地块。

这是一个简单的原型脚本。该脚本在主目录'/home/user/my_analysis/'中创建 N 个子文件夹。所有子文件夹都命名为“AnalysisX”,其中 X 是文件夹的编号。

每个文件夹都包含不同的情节。

注意:我的文件夹路径适用于 linux 机器,所以请记住,“/home/user/some_folder/”在 Windows 中不是有效路径!(我看到你已经把那部分做对了,但它可能对其他用户有用)。

import os
import numpy as np
import matplotlib.pyplot as plt


def create_plot(file_name, x, y):
    # Create your plot
    fig = plt.figure()
    plt.plot(x, y, color='red', linewidth=2)
    plt.savefig(file_name)
    plt.show()


def main():
    # must be full-path
    parent_folder = '/home/user/my_analysis/'

    # move to parent directory
    os.chdir(parent_folder)

    file_name = 'plot'
    extension = '.png'
    for i in range(5):
        # Create a new folder
        folder_name = 'Analysis' + str(i+1)
        os.mkdir(folder_name)

        full_file_name = folder_name + '/' + file_name + extension
        x = np.linspace(1, 100, 100)
        y = np.random.random(100)
        create_plot(full_file_name, x, y)


if __name__ == '__main__':
    main()

为清楚起见,这就是文件夹结构的样子。我只审查了我的真实用户名:

在此处输入图像描述

于 2021-08-19T10:41:11.530 回答
2

您仍然没有提供 DataFrame 作为示例。我无权访问您的本地文件夹。无论如何,我假设你有 pandas DataFrame,所以我为随机数据编写代码。在给你一个代码之前,我会试着澄清一些误解:

1.引用您的评论:

# 创建你的情节。我的理解是,在这里我应该只给出我想要绘制的 x 和 y。 是的,这是正确的。但是,您将 pandas 绘图和 matplotlib 混为一谈:

plt.plot(x, y, color = "red", kind = "line", legend = "true", linewidth = 2)

坚持一个。kind='line', legend = 'true'是 pandas 绘图,而plt.plot()matplotlib 是绘图。混合它是行不通的;)

2.extension = '.png'没有必要(至少在这种情况下)

plt.savefig().png无论如何都会给你。我没有尝试过,但我想如果您添加.png为文件名,它甚至可能会导致其他问题。

所以这是我的代码:

def create_plot(file_name, x, y):
    fig, ax = plt.subplots()
    ax.plot(x, y, 'r', linewidth = 2)
    plt.savefig(file_name)
    plt.close()

def createalotofdata(n, df):
    for i in range(n):
        df[f'data number{i}'] = np.random.rand(10)
#     print(df)

x = np.arange(10)
df = pd.DataFrame({'x0': x})

createalotofdata(5, df)

for i in range(len(list(df))-1):
    create_plot(f'Plot number {i}', df['x0'], df[f'data number{i}'])

所以输出什么都看不到,只有图被保存:

在此处输入图像描述

希望您理解并根据您的需要进行调整。如果仍有不清楚的地方,请再次询问。

于 2021-08-19T15:31:41.333 回答
1

所以昨天我发布了这个问题:如何为不同的分析绘制 n 个图,并将它们保存在不同的 .png 文件中?感谢 Karina 和 Waykiki(以及我自己),我成功了!下面是我现在拥有的代码 - 实际有效 - 带有一个示例。

我用一个简单的数据框创建了一个简单的例子:

import os
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'ID':['A','B','B','A','C','C'], 'X': [5,3,4,2,5,3], 'Y':[1,2,6,4,5,2]}) #simple dataframe

def create_plot(file_name, x, y):
    # Create your plot
    plt.plot(x, y, color='red', linewidth=2, label = ID) # As I was advised, I stoped using "group.plot" which is a function from pandas plotting library : stick to one library !
    plt.savefig(file_name)
    plt.show()

def main():
    # must be full-path
    parent_folder = r"C:\Users\A\AppData\Local\Programs\Python\Python39\Test"
    
    # move to parent directory
    os.chdir(parent_folder)

    extension = '.png'
    for i in range(5):
        # Create a new folder
        folder_name = 'Analysis' + str(i+1)
        file_name = 'Analysis' + str(i+1)
        #print(type(file_name))
        os.mkdir(folder_name)
        for ID in df.ID.unique():
        #for ID, group in groups:
            df1 = df[df.ID == ID]
            file_name = "Analysis " + str(i+1) +" - {}".format(ID)
            print(file_name)
            full_file_name = folder_name + '/' + file_name + extension
            x = df1.X
            y = df1.Y
            create_plot(full_file_name, x, y)
if __name__ == '__main__':
    main()

此代码有效。我现在可以 :

  1. 使用 create_plot() 函数绘制图形
  2. 每次分析创建 1 个文件夹(此处为 5 个分析)
  3. 将每个图保存到一个 .png 文件,其名称在“file_name”中定义(即 Analysis 1 - C(在文件夹 Analysis1 中),Analysis 2 - A(在文件夹 Analysis2,...)

现在我需要编码的是:

  1. 如何告诉我的代码对于分析 1 我想要我的 df 的一些列,对于分析 2 一些其他列,依此类推
  2. 更改 x_axis 标签,使其显示我定义的日期。

希望这对社区有所帮助!

于 2021-08-20T08:21:24.450 回答