簡體   English   中英

python 使用 argparse 傳遞可選 arguments 進行繪圖

[英]python use argparse for passing optional arguments for plotting

我想將可選的 arguments 傳遞給從命令行運行的 matplotlib 腳本。

我有以下內容:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg')

import pandas as pd
import argparse

parser = argparse.ArgumentParser(description="Plot x,y data in python")
parser.add_argument('-xF',"--x", type=str, metavar='', required=True, help="x-Data")
parser.add_argument('-yF', "--y", type=str, metavar='', required=True, help="y-Data")
parser.add_argument('-o', "--options", nargs="+", default=[], help="Options for plotting")
args = parser.parse_args()

def plot(x, y, xlabel, ylabel, name, legend=None, otherArgs=None):

    xData = pd.read_csv(x) 
    yData = pd.read_csv(y)     

    plt.figure()
    plt.plot(xData, yData, label=legend, *(otherArgs), zorder=1)   
    plt.tight_layout()
    plt.savefig("tst.tiff")

if __name__ == '__main__':
    plot(args.x, args.y, args.options)

但是,目前我無法這樣做。 有沒有辦法在可選的 arguments 其他參數下傳遞給 plot 函數? 設置 colors,標記等。 ?

最好的祝福

如果你將運行

-o color=red marker=o

然后你會得到清單

["color=red", "marker=o"]

你可以使用split("=")dict()

args.options = dict(x.split('=') for x in args.options)

把它作為字典

{"color":"red", "marker":"o"}

然后你可以用**來放字典

plt.plot(..., **otherArgs)   

它將接受它作為正確的參數。


最小的工作代碼:

為了測試,我將 argumenst 直接放在sys.argv中——這樣我就可以運行它而無需在控制台中寫入參數。

編輯:它需要字典default={}而不是default=[]

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#matplotlib.use('Agg')

import pandas as pd
import argparse

# --- functions ---

def plot(x, y, xlabel='X', ylabel='Y', name='Name', legend=None, otherArgs=None):

    xData = [1,2,3]
    yData = [3,1,1]

    plt.figure()
    plt.plot(xData, yData, label=legend, **otherArgs, zorder=1)   
    plt.tight_layout()
    #plt.savefig("tst.tiff")
    plt.show()

# --- main ---

if __name__ == '__main__':
    
    import sys
    sys.argv += ['--x', '1', '--y', '2', '-o', 'color=red', 'marker=o']

    parser = argparse.ArgumentParser(description="Plot x,y data in python")
    parser.add_argument('-xF',"--x", type=str, metavar='', required=True, help="x-Data")
    parser.add_argument('-yF', "--y", type=str, metavar='', required=True, help="y-Data")
    parser.add_argument('-o', "--options", nargs="+", default={}, help="Options for plotting")   # `default={}` instead of `default=[]`
    args = parser.parse_args()

    print('[args.options] before:', args.options)
    
    args.options = dict(x.split('=') for x in args.options)

    print('[args.options] after :', args.options)
    
    plot(args.x, args.y, otherArgs=args.options)

安慰:

[args.options] before: ['color=green', 'marker=o']
[args.options] after : {'color': 'green', 'marker': 'o'}

編輯:

我還找到了基於argparse.Action創建自己的 class 的方法,然后將其分配給 add_param(..., action add_param(..., action=...)

class keyvalue(argparse.Action):
    
    def __call__(self, parser, namespace, values, option_string):
        #print(parser)
        #print(values)
        #print(option_string)
        print('[namespace] before:', namespace)
        
        data = dict()
        
        for value in values:
            key, val = value.split('=')
            data[key] = val
            
        setattr(namespace, self.dest, data)
        
        print('[namespace] after :', namespace)
parser.add_argument('-o', "--options", nargs="+", default={},  action=keyvalue)

完整的工作代碼

import argparse
import matplotlib.pyplot as plt
#matplotlib.use('Agg')
#import pandas as pd

# --- functions ---

def plot(x, y, xlabel='X', ylabel='Y', name='Name', legend=None, otherArgs=None):

    xData = [1,2,3]
    yData = [3,1,1]

    plt.figure()
    plt.plot(xData, yData, label=legend, **otherArgs, zorder=1)   
    plt.tight_layout()
    #plt.savefig("tst.tiff")
    plt.show()

class keyvalue(argparse.Action):
    
    def __call__(self, parser, namespace, values, option_string):
        #print(parser)
        #print(values)
        #print(option_string)
        print('[namespace] before:', namespace)
        
        data = dict()
        
        for value in values:
            key, val = value.split('=')
            data[key] = val
            
        setattr(namespace, self.dest, data)
        
        print('[namespace] after :', namespace)

# --- main ---
        
if __name__ == '__main__':
    
    import sys
    sys.argv += ['--x', '1', '--y', '2', '-o', 'color=green', 'marker=o']

    parser = argparse.ArgumentParser(description="Plot x,y data in python")
    parser.add_argument('-xF',"--x", type=str, metavar='', required=True, help="x-Data")
    parser.add_argument('-yF', "--y", type=str, metavar='', required=True, help="y-Data")
    parser.add_argument('-o', "--options", nargs="+", default={}, help="Options for plotting", action=keyvalue)
    args = parser.parse_args()

    print('[args.options] before:', args.options)
    
    plot(args.x, args.y, otherArgs=args.options)

來源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM