Python Matplotlib-打印的默认可选参数

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”作为默认参数。因此,情节应该是黑白的。然而,输出是丰富多彩的

我遇到了我想理解的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”作为默认参数。因此,情节应该是黑白的。然而,输出是丰富多彩的

如果删除可选颜色参数,则会得到黑线。所以我的问题是,为什么上面的绘图是彩色的,即使我没有将其作为颜色选项传递

编辑:我理解删除
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