簡體   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