Python Matplotlib-打印的默认可选参数
我遇到了我想理解的python行为。请看下面几行Python Matplotlib-打印的默认可选参数,python,matplotlib,Python,Matplotlib,我遇到了我想理解的python行为。请看下面几行 import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,1,100) plt.plot(x, x, 'k', color=None) plt.plot(x, x**2, 'k', color=None) 根据matplotlib文档,在中定义了绘图KWARG。在这里,我们发现color将“None”作为默认参数。因此,情节应该是黑白的。然而,输出是丰富多彩的
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,100)
plt.plot(x, x, 'k', color=None)
plt.plot(x, x**2, 'k', color=None)
根据matplotlib文档,在中定义了绘图KWARG。在这里,我们发现color将“None”作为默认参数。因此,情节应该是黑白的。然而,输出是丰富多彩的
如果删除可选颜色参数,则会得到黑线。所以我的问题是,为什么上面的绘图是彩色的,即使我没有将其作为颜色选项传递
编辑:我理解删除color=None
会导致'k'
被用作颜色选项。但是,我想了解matplotlib如何在内部区分
plt.plot(x, x, 'k', color=None)
及
如果颜色参数默认为None
。(根据文档)在plt.plot(x,x,'k',color=None)中,有两种颜色定义。第一个是位置参数'k'
(黑色),第二个是关键字参数color=None
如果省略color=None
,则将使用位置参数'k'
,并且线条将为黑色。这里没有晚餐
如果指定color=None
,它将覆盖'k'
参数。因此,color=None
将确定颜色,这意味着根据颜色选择颜色
回答如何区分这些情况的问题:
首先,让我注意到matplotlib管理参数和关键字参数以最终决定行的属性的方式相当复杂。要查看实际发生的情况,您可以从各种函数和类开始并跟随参数。
这里要解释的东西太多了,所以让我们看一个例子,说明如何以简化的方式完成
绘图方法看起来不像def plot(x,y,something,color=None)
,而只是def plot(*args,**kwargs)
因此,color
不是一个参数,而是一个关键字参数。两种颜色参数的伪装方式如下
def plot(*args,**kwargs):
x = args[0]
y = args[1]
if len(args) > 2:
color = args[2]
else:
color = None
color = kwargs.get("color", color)
print color
plot([1,2],[3,4], "k", color=None) # prints None
plot([1,2],[3,4], "k") # prints k
plot([1,2],[3,4], color=None) # prints None
plot([1,2],[3,4]) # prints None
在plt.plot(x,x,'k',color=None)
中,有两种颜色定义。第一个是位置参数'k'
(黑色),第二个是关键字参数color=None
如果省略color=None
,则将使用位置参数'k'
,并且线条将为黑色。这里没有晚餐
如果指定color=None
,它将覆盖'k'
参数。因此,color=None
将确定颜色,这意味着根据颜色选择颜色
回答如何区分这些情况的问题:
首先,让我注意到matplotlib管理参数和关键字参数以最终决定行的属性的方式相当复杂。要查看实际发生的情况,您可以从各种函数和类开始并跟随参数。
这里要解释的东西太多了,所以让我们看一个例子,说明如何以简化的方式完成
绘图方法看起来不像def plot(x,y,something,color=None)
,而只是def plot(*args,**kwargs)
因此,color
不是一个参数,而是一个关键字参数。两种颜色参数的伪装方式如下
def plot(*args,**kwargs):
x = args[0]
y = args[1]
if len(args) > 2:
color = args[2]
else:
color = None
color = kwargs.get("color", color)
print color
plot([1,2],[3,4], "k", color=None) # prints None
plot([1,2],[3,4], "k") # prints k
plot([1,2],[3,4], color=None) # prints None
plot([1,2],[3,4]) # prints None
参数
'k'
是黑色的颜色缩写。
但是当您设置color=None
时,它会用None
覆盖黑色,这意味着matplotlib将使用默认颜色
matplotlib随后将自动循环颜色。默认情况下,它在蓝色、绿色、红色、青色、洋红、黄色和黑色之间循环
编辑:在matplotlib 2.0中,默认颜色循环已更改:参数
'k'
是黑色的颜色缩写。
但是当您设置color=None
时,它会用None
覆盖黑色,这意味着matplotlib将使用默认颜色
matplotlib随后将自动循环颜色。默认情况下,它在蓝色、绿色、红色、青色、洋红、黄色和黑色之间循环
编辑:在matplotlib 2.0中,默认颜色循环已更改:具有
None
,因为默认参数向matplotlib指示未指定color
参数的值,所以使用默认值。这不是为了禁用颜色。我仍然不明白在python中这是怎么可能的。比如说,我定义了一个函数def foo(a=None)
。我不知道怎么可能知道我把它叫做foo()
还是foo(a=None)
。但很显然,matplotlib可以区分这两个调用,因为它从彩色转换为黑白。你知道为什么吗?这取决于函数是如何编写的。如果函数是def foo(a=None)
则是,这两个调用是等效的。如果将其定义为def foo(**kwargs)
,kwargs
将是foo()
的空字典,而{a':None}
将是foo(a=None)
。然后,行为取决于函数如何处理kwargs
谢谢,我现在明白了。将None
作为默认参数向matplotlib表明没有指定color
参数的值,因此使用默认值。这不是为了禁用颜色。我仍然不明白在python中这是怎么可能的。比如说,我定义了一个函数def foo(a=None)
。我不知道怎么可能知道我把它叫做foo()
还是foo(a=None)
。但很显然,matplotlib可以区分这两个调用,因为它从彩色转换为黑白。你知道为什么吗?这取决于函数是如何编写的。如果函数i