我正在设置一些代码,以便在进行绘制之前,用户可以基本上将他们要使用的所有绘制变量存储在字典中,并将这些条目存储起来以备后用。字典的键遵循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值对应于字典值,并且其网格处于打开状态。知道为什么这个情节会空白吗?
记录下来,我知道这里有解决方法,可以用另一种方法解决。但是,我很好奇为什么会这样。
答案 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()
满足您的期望
答案 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()
以及其他可以在其中进行设计的其他功能干净的方法。