我正在绘制多个对象,它们都由多条直线组成。为此,我使用了一系列颜色,并为每个对象分配了一种。所需的结果如下所示:
我使用命令plt.plot
进行此操作,提供起点和终点以及颜色。
在尝试获得此结果时,我犯了一个错误,我提供了诸如'pink'
之类的值,而不是诸如(0, 0.75, 0)
之类的名称。
结果是:
为什么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中似乎有一些已记录且众所周知的功能,它们仅使用颜色循环并在未提供有效颜色时获取其中的下一个颜色。不过,我无法找到有关此方面的文档,因此,我希望提供一些文档报价,或者答案是未记录的行为,或者类似的内容。
还值得指出的是,当我使用无效的颜色参数时,在图像的中间也绘制了一些东西,但当使用正确的值时却没有。为什么?
答案 0 :(得分:3)
plot
的呼叫签名非常疯狂。这是因为它随着时间的推移而增长,并且是最常用的功能之一,因此始终保持向后兼容。
文档说明了以下调用此函数的方法。
plot([x], y, [fmt], data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
方括号中的参数是可选的,省略号表示要传递的任意数量的其他参数。
从上面回顾案例,并重命名各自的参数:
plt.plot([-1,-1], [-1,1], 'k')
plt.plot( x , y , fmt)
'k'
是预期的格式。
plt.plot([0,0],[-1,1], False)
plt.plot( x , y , y2 )
此处,False
是无效的格式字符串。因此,它被解释为新行的数据。由于没有其他后续参数可以解释,因此不能为x2
,因此必须为y2
。 False
等同于0
。因此,您将在(0,0)处获得一个点,该点在图中未显示,因为未指定标记。如果您要使用
plt.plot([0,0],[-1,1], False, "o")
相反,您会看到橙色的单个点。
与上述相同。唯一的不同是,您会根据使用的颜色循环仪获得不同颜色的线条(请参见此答案的下面)。
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)
绘制了一条线。
除第一种情况外,均未指定颜色。在这种情况下,根据文档
默认情况下,为每行分配一个由“样式周期”指定的不同样式。仅当您希望与这些默认值明显不同时,才需要使用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()
您可以使用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)
,所以这就是为什么您的绘图上还有一个额外的线段。通常情况下,绘图将为其分配默认颜色。