Python 为什么matplotlib用这么多颜色给我的绘图着色?

Python 为什么matplotlib用这么多颜色给我的绘图着色?,python,matplotlib,Python,Matplotlib,我正在绘制多个对象,它们都由多条直线组成。为此,我使用一个颜色列表,并为每个对象指定一个颜色。预期结果如下所示: 我使用命令plt.plot,提供起点和终点以及颜色 在试图得到这个结果时,我犯了一个错误,我提供了(0,0.75,0)之类的值,而不是“pink” 结果是: 为什么matplotlib会这样做?我想了解,当我总是提供相同的错误输入时,为什么每个片段都有自己的颜色,似乎是随机选择的 当没有传递正确的输入值时,我无法找到行为的文档。如果有文档,如果matplotlib每次都随机选择,

我正在绘制多个对象,它们都由多条直线组成。为此,我使用一个颜色列表,并为每个对象指定一个颜色。预期结果如下所示:
我使用命令
plt.plot
,提供起点和终点以及颜色

在试图得到这个结果时,我犯了一个错误,我提供了
(0,0.75,0)
之类的值,而不是
“pink”
结果是:

为什么matplotlib会这样做?我想了解,当我总是提供相同的错误输入时,为什么每个片段都有自己的颜色,似乎是随机选择的

当没有传递正确的输入值时,我无法找到行为的文档。如果有文档,如果matplotlib每次都随机选择,那么相关部分的引用就已经构成了答案

当我传递
False
而不是颜色时,也会发生相同的行为


MCVE

import matplotlib.pyplot as plt

# Line in black
plt.plot([-1,-1], [-1,1], 'k')
# Line in bad color
plt.plot([0,0],[-1,1], False)
# Line in same bad color
plt.plot([1,1],[-1,1], False)
# Line in other bad color
plt.plot([2,2],[-1,1], (0,0.75,0))
# Line in same other bad color
plt.plot([3,3],[-1,1], (0,0.75,0))
plt.show()


注意:
我不是在寻找如何通过传递一个恒定的颜色来获得我想要的结果。我做到了。但是在去那里的路上,我遇到了这种行为,我想了解一下。
根据这些评论,pyplot中似乎有一些记录在案的众所周知的功能,只使用颜色循环,在没有提供有效颜色时使用下一种颜色。我无法找到关于这方面的文档,所以我想引用一些文档,或者回答这是未记录的行为,或者类似的东西


也值得指出的是,当我使用无效的颜色参数时,图像中间的东西也被画出来,但是当使用正确的值时,也没有画出来。为什么?

没有看到代码就很难回答, 但是你能试着明确地分配颜色吗?更重要的是,您不能
plt.plot(x,y,color)
,您需要像这样显式地编写参数的名称
plt.plot(x,y,c=color)
plt.plt(x,y,color=color)

您可以尝试以下代码:

import matplotlib.pyplot as plt


blue = (0,0,0.75)
green = (0, 0.75, 0)
# Line in black
plt.plot([-1,-1], [-1,1], color = blue)
# Line in bad color
plt.plot([0,0],[-1,1] , color = blue)
# Line in same bad color
plt.plot([1,1],[-1,1], color = blue)
# Line in other bad color
plt.plot([2,2],[-1,1], color = green)
# Line in same other bad color
plt.plot([3,3],[-1,1], color = green)
plt.show()

您可以使用
plt.plot([3,3],-1,1],“绿色”)
而不是
plt.plot([3,3],-1,1],绿色)
的原因来自

默认的第三个参数是fmt,其定义是,格式字符串由颜色、标记和线的一部分组成:fmt='[color][marker][line]'。 我认为
plot
函数如果识别出第三个参数是可接受的字符串,就会正常工作

函数将把“(0,0.75,0)”作为
x=(0,1,2)y=(0,0.75,0)
的线段处理,而不是将“(0,0.75,0)”输入
“绿色”
。通常,绘图会为其指定默认颜色

的呼叫签名非常疯狂。这是因为它随着时间的推移而增长,并且是最常用的函数之一,因此它始终保持向后兼容

文档说明了调用此函数的以下方法

plot([x], y, [fmt], data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
方括号中的参数是可选的,省略号表示要传递的其他任意数量的参数

从上面看案例,并重命名各自的参数:

1. 正如预期的那样,
'k'
是要使用的格式

2. 此处,
False
不是有效的格式字符串。因此,它被解释为新线的数据。由于没有其他可以解释的下列参数,因此它不能是
x2
,因此它必须是
y2
False
相当于
0
。因此,您将在(0,0)处获得一个点,在绘图中看不到该点,因为没有指定标记。如果你要用

plt.plot([0,0],[-1,1], False, "o")
相反,您将看到橙色的单点

3. 同上。唯一的区别是,根据正在使用的颜色循环器,您可以获得不同颜色的线条(请参见下面的答案)

4. 同样,第三个参数不是有效的格式字符串。它再次被解释为另一行的y值。这一次,与2相比。和3.,
y2
包含多个坐标。因此,沿着点
(0,0)、(1,0.75)、(2,0)
绘制一条线


在除第一种情况外的所有情况下,均未指定颜色。在这种情况下,根据文件

默认情况下,每行都指定了一个由“样式循环”指定的不同样式。fmt和line特性参数仅在希望与这些默认值有明显偏差时才是必需的。或者,也可以使用“axes.prop_cycle”rcParam更改样式循环

由于默认特性循环器仅包含颜色,因此您将在任何地方获得相同的线型,但颜色不同

您可以打印默认的循环器

print(plt.rcParams["axes.prop_cycle"])

# cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b',
#                   '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
或者你可以设置它

plt.rcParams["axes.prop_cycle"] = plt.cycler("color", ["red", "#001eff", (0, 0.75, 0)])
matplotlib页面上提供了一个示例:以及

cycler
也有自己的文档页面,因为它同样可以用于matplotlib之外的其他内容

回到问题的开头;为了获得相同颜色的所有线条,可以将颜色循环器设置为单一颜色

plt.rcParams["axes.prop_cycle"] = plt.cycler("color", ["k"])

在这种情况下,轴上的所有行都将显示为黑色。

如果看不到代码,很难说,最好是确定,请稍候。它实际上只是使用命令
plt.plot(a,b,False)
多次调用
plt.plot
将转到cycle@lucidbrot:您可以定义颜色,以便即使在使用for循环后,所有线都以相同的颜色打印。您可以在索引上使用一些if条件,以便获得两种颜色:绿色和绿色blue@DavidG增加了MCVE。你有关于颜色循环的文档链接吗?我基本上是自己实现的,因为我没有找到docu
print(plt.rcParams["axes.prop_cycle"])

# cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b',
#                   '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
plt.rcParams["axes.prop_cycle"] = plt.cycler("color", ["red", "#001eff", (0, 0.75, 0)])
plt.rcParams["axes.prop_cycle"] = plt.cycler("color", ["k"])