繁体   English   中英

Plot n张图并将它们保存在n个不同的文件中

[英]Plot n graphs and save them in n different files

首先,我想明确一点,我不是 Python 方面的专家,并且仍在学习如何使用 pandas。我翻阅了较旧的帖子,但没有找到合适的答案。

我一直在尝试对 92 份合同的数据分析进行编码。 对于它们中的每一个,我想 plot 进行特定分析(每次都采用相同的 dataframe 的一些列)并将每个分析保存在不同的文件夹中(分析 1,分析 2,...)。

到目前为止,我面临着许多困难。 因此,在关注 plot 之前,我想了解如何每次将每个 plot 的保存编码到不同的 .png 文件中。 我试过的代码似乎没有保存任何东西,因为当我 go 到它是空的文件夹时。

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

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()

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

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

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

谢谢

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

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

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

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

每个文件夹包含一个不同的 plot。

注意:我的文件夹路径是针对 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()

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

在此处输入图像描述

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

1. 引用你的评论:

# 创建你的 plot。我的理解是这里我应该只给 plot 我想要的 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}'])

所以output就没什么可看的了,只保存了剧情:

在此处输入图像描述

希望您能理解并能根据您的需要进行调整。 如果还有什么不清楚的地方,请再问一遍。

所以昨天我发布了这个问题:如何将 plot n 个图表用于不同的分析,并将它们保存在不同的 .png 文件中? 多亏了 Karina 和 Waykiki(还有我自己),我做到了。 下面是我现在拥有的代码 - 实际有效 - 带有一个例子。

我用一个简单的 dataframe 创建了一个简单的例子:

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. Plot 使用 create_plot() 的数字 function
  2. 每次分析创建 1 个文件夹(这里有 5 个分析)
  3. 将每个 plot 保存到一个 .png 文件,其名称在“file_name”中定义(即分析 1 - C(在文件夹 Analysis1 中),分析 2 - A(在文件夹 Analysis2 中,...)

现在我需要编码的是:

  1. 如何告诉我的代码,为了分析 1,我想要我的 df 的一些列,为了分析 2 一些其他列,等等
  2. 更改 x_axis label 以显示我定义的日期。

希望这对社区有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM