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

时间:2018-11-02 16:17:58

标签: python matplotlib

我正在绘制多个对象,它们都由多条直线组成。为此,我使用了一系列颜色,并为每个对象分配了一种。所需的结果如下所示: two colors
我使用命令plt.plot进行此操作,提供起点和终点以及颜色。

在尝试获得此结果时,我犯了一个错误,我提供了诸如'pink'之类的值,而不是诸如(0, 0.75, 0)之类的名称。
结果是:
many colors

为什么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()

MCVE Result Image


注意:
我不是在寻找如何通过传递恒定的颜色来获得所需结果的方法。我做到了但是在那儿,我遇到了这种行为,我想了解一下。
根据评论,pyplot中似乎有一些已记录且众所周知的功能,它们仅使用颜色循环并在未提供有效颜色时获取其中的下一个颜色。不过,我无法找到有关此方面的文档,因此,我希望提供一些文档报价,或者答案是未记录的行为,或者类似的内容。

还值得指出的是,当我使用无效的颜色参数时,在图像的中间也绘制了一些东西,但当使用正确的值时却没有。为什么?

2 个答案:

答案 0 :(得分:3)

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

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

plot([x], y, [fmt], data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)

方括号中的参数是可选的,省略号表示要传递的任意数量的其他参数。

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

1。

plt.plot([-1,-1], [-1,1], 'k')
plt.plot(   x   ,    y  , fmt)

'k'是预期的格式。

2。

plt.plot([0,0],[-1,1], False)
plt.plot(  x  ,   y  ,   y2 )

此处,False是无效的格式字符串。因此,它被解释为新行的数据。由于没有其他后续参数可以解释,因此不能为x2,因此必须为y2False等同于0。因此,您将在(0,0)处获得一个点,该点在图中未显示,因为未指定标记。如果您要使用

plt.plot([0,0],[-1,1], False, "o")

相反,您会看到橙色的单个点。

enter image description here

3。

与上述相同。唯一的不同是,您会根据使用的颜色循环仪获得不同颜色的线条(请参见此答案的下面)。

4。

plt.plot([2,2],[-1,1], (0,0.75,0))
plt.plot(  x  ,   y  ,     y2    )

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

enter image description here


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

  

默认情况下,为每行分配一个由“样式周期”指定的不同样式。仅当您希望与这些默认值明显不同时,才需要使用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页面上提供了一个示例:Styling with cycler以及Colors in the default property cycle

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

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

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

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

答案 1 :(得分:1)

没有看到代码,很难回答, 但是您可以尝试明确分配颜色吗?而且,您不能plt.plot(x,y,color),您需要像这样显式地编写参数名称 plt.plot(x,y,c = color)plt.plot(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()

enter image description here

您可以使用plt.plot([3,3],[-1,1], "green")而不是plt.plot([3,3],[-1,1], green)的原因来自plot documentaion

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

该函数将'(0,0.75,0)'视为"green"的线段,而不是将{(1,0,0.75,0)'替换为x = (0, 1, 2) y =(0, 0.75, 0),所以这就是为什么您的绘图上还有一个额外的线段。通常情况下,绘图将为其分配默认颜色。