字典可以用作matplotlib.pyplot的完整输入吗?

时间:2019-05-15 16:01:52

标签: python dictionary matplotlib

我正在设置一些代码,以便在进行绘制之前,用户可以基本上将他们要使用的所有绘制变量存储在字典中,并将这些条目存储起来以备后用。字典的键遵循matplotlib.pyplot关键字语法。这个字典的一个例子是这样的:

plot_info = {'title':'A neato title!',
             'x':[1,2,3,4],
             'y':[5,6,7,8],
             'grid':'on'}

如何将这本词典带入绘图命令,以执行键作为参数,并执行参数作为这些参数的输入?

到目前为止,我已经尝试过:

import matplotlib.pyplot as plt
plot_info = {'title':'A neato title!',
             'x':[1,2,3,4],
             'y':[5,6,7,8],
             'grid':'on'}
plt.plot(**plot_info)

期望可以做到这一点。但是,在运行代码时,该图形会弹出,但该图形为空,并且所有内容均为空白(运行时没有错误,但打开了一个空图形)。

我希望输出显示一个图,其标题,x和y值对应于字典值,并且其网格处于打开状态。知道为什么这个情节会空白吗?

记录下来,我知道这里有解决方法,可以用另一种方法解决。但是,我很好奇为什么会这样。

3 个答案:

答案 0 :(得分:1)

否,您不能使用plt.plot来做到这一点。原因是plt.plot的签名为:

def plot(*args, scalex=True, scaley=True, data=None, **kwargs)

第一个参数args是一个 var-positional 参数,它接收要绘制的数据。请参阅词汇表中的parameter的定义:

  

参数

     

function(或方法)定义中的命名实体,它指定函数可以接受的argument(或在某些情况下为参数)。参数有五种:

     

位置或关键字:指定可以通过positionally或作为keyword argument传递的参数。这是默认的参数类型,例如以下的foo和bar:

def func(foo, bar=None): ...
     

仅位置:指定只能按位置提供的参数。 Python没有用于定义仅位置参数的语法。但是,某些内置函数具有仅位置参数(例如abs())。

     

仅关键字:指定只能由关键字提供的参数。仅关键字参数可以通过在函数定义的参数列表中包含单个var-positional参数或裸*来定义,例如 kw_only1 kw_only2 在以下内容中:

def func(arg, *, kw_only1, kw_only2): ...
     

var-positional :指定可以提供任意顺序的位置参数序列(除了已被其他参数接受的任何位置参数之外)。可以通过在参数名称前加上*来定义这样的参数,例如以下的 args

def func(*args, **kwargs): ...
     

var-keyword :指定可以提供任意多个关键字参数(除了已被其他参数接受的任何关键字参数)。可以通过在参数名称前加上**来定义这样的参数,例如上例中的 kwargs

     

参数可以指定可选参数和必需参数,以及一些可选参数的默认值。

     

另请参见argument词汇表条目,the difference between arguments and parameters的FAQ问题,inspect.Parameter类,Function definitions部分和PEP 362

您只能使用字典为位置或关键字仅关键字参数提供参数。 var-positional 参数args都不是,因此无论如何都无法填充。

顺便说一句,关于上面仅位置参数的定义,PEP 570中已经接受了它们的正确语法。

答案 1 :(得分:0)

我不认为您要问的是可能的。 plt.plot() doesn't have grid or title arguments。而是将这些参数提供给plt itself!为此,您将需要几行代码(因为它们是plt对象的不同方法),例如:

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4],
         [5, 6, 7, 8])

plt.grid(True)
plt.title('A neato title!')

plt.show()

制作一个有效的脚本。我不确定您想要的解决方案比内置功能更容易/更美观,因为您仍然必须指定参数。如果您尝试实现默认值,也许有一个函数可以解决这个问题(您也可以扩展此示例以解压缩字典):

def plot_my_data(x=(1, 2, 3, 4),
                 y=(5, 6, 7, 8),
                 grid_flag=True,
                 title='A neato title!'):
    plt.plot(x, y)
    plt.grid(grid_flag)
    plt.title(title)

现在这里很简单

plot_my_data()
plt.show()

满足您的期望

output graph

答案 2 :(得分:0)

Reedinationer的答案已经是一个不错的开始,我可能建议创建一个类,例如:

import matplotlib.pyplot as plt

class CustomPlot(object):
    """docstring for CustomPlot"""
    def __init__(self, plot_dict):
        super(CustomPlot, self).__init__()
        self.plot_dict = plot_dict
        ## you should also include some kind of "validation" here
        ## which verifies the plot_dict key:value pairs 
        self.make_plot()
        plt.show()

    def make_plot(self):
        fig,ax=plt.subplots()
        for k,v in self.plot_dict.items():
            if isinstance(v,dict):
                print(k)
                if k=='plot':
                    eval('plt.plot({x},{y})'.format(**v))
            else:
                print(v)
                eval('plt.{0}("{1}")'.format(k,v) )

plot_info = {
    'title':'A neato title!',
    'plot':{    
        'x':[1,2,3,4],
        'y':[5,6,7,8],
    },
    'grid':'True'
}

p=CustomPlot(plot_info)

注意::我在这里使用eval(),但这并不是一种干净的方法。要求您正确验证字典,然后再将其交给eval(),然后真的,真的要进行测试。在示例性输入中,例如建议您使用参数plt.plot()来调用title,该参数不是您最初暗示的 matplotlib.pyplot关键字语法。这是您的潜在用户也可能发生的错误,因此您需要对此进行调整(即,自行处理错误)。最好创建例如允许的函数调用和预期类型的​​字典,然后将其用于验证。

此外,这样的类只能作为开始 ,您接下来应该考虑定义其他辅助功能,例如def loads_data()def store_dict()以及其他可以在其中进行设计的其他功能干净的方法。