获取matplotlib颜色周期

2024-04-25 01:47:26 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以查询matplotlib颜色周期的当前状态?换句话说,是否有一个函数get_cycle_state将按以下方式运行?

>>> plot(x1, y1)
>>> plot(x2, y2)
>>> state = get_cycle_state()
>>> print state
2

我希望状态是下一种颜色的索引,它将用于绘图。或者,如果它返回下一个颜色(在上面的例子中是默认循环的“r”),那也可以。


Tags: 函数绘图getplotmatplotlib颜色状态方式
3条回答

注意:在matplotlib的最新版本中(>;=1.5)_get_lines已更改。现在需要在Python 2或3中使用next(ax._get_lines.prop_cycler)['color'](或者Python 2中使用ax._get_lines.prop_cycler.next()['color'])来从颜色循环中获取下一个颜色。

尽可能使用@joe kington回答的下面部分所示的更直接的方法。由于_get_lines不是面向API的,因此将来可能会以不向后兼容的方式再次更改。

下面是1.5中的一种工作方式,它不依赖于以下划线开头的方法,有望成为未来的证明:

colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]

这将为您提供按当前样式定义的颜色列表。

访问颜色循环迭代器

没有“面向用户”(也称为“public”)方法来访问底层迭代器,但是您可以通过“private”(按惯例)方法访问它。但是,如果不更改它,就无法获取iterator的状态。

设置颜色周期

快速旁白:您可以通过多种方式设置颜色/属性循环(例如,ax.set_color_cycle在versions<;1.5或ax.set_prop_cycler在>;=1.5中)。看看example here for version 1.5 or greater,或者previous style here

访问底层迭代器

然而,虽然没有面向公共的方法来访问iterable,但是您可以通过_get_lineshelper类实例来访问给定axes对象(ax)的iterable。ax._get_lines是一个很容易混淆的名字,但它是幕后机器,允许plot命令处理所有可以调用plot的奇怪和多样的方式。除此之外,它还可以跟踪要自动分配的颜色。类似地,还有ax._get_patches_for_fill来控制通过默认填充颜色和修补程序属性的循环。

无论如何,线的颜色周期是ax._get_lines.color_cycle,补丁是ax._get_patches_for_fill.color_cycle。在matplotlib>;=1.5上,这已更改为use the ^{} library,iterable被称为prop_cycler,而不是color_cycle,并生成属性的dict,而不是仅生成颜色。

总的来说,你会做如下事情:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
# or ax._get_lines.prop_cycler on version >= 1.5
# Note that prop_cycler cycles over dicts, so you'll want next(cycle)['color']

无法查看iterator

的状态

然而,这个对象是一个“裸的”iterator。我们可以很容易地得到下一个项目(例如next_color = next(color_cycle)),但这意味着在这个之后的下一个颜色将被绘制出来。根据设计,如果不更改迭代器的当前状态,就无法获取它。

v1.5或更高版本中,最好获得使用的cycler对象,因为我们可以推断其当前状态。但是,cycler对象本身在任何地方都不可访问(公开或私下)。相反,只有从cycler对象创建的itertools.cycle实例是可访问的。不管怎样,都无法到达颜色/属性循环器的基本状态。

匹配先前打印项的颜色,而不是

在你的例子中,听起来你想匹配刚刚绘制的东西的颜色。不要试图确定颜色/属性是什么,而是根据打印内容的属性设置新项的颜色/等。

例如,在你所描述的情况下,我会这样做:

import matplotlib.pyplot as plt
import numpy as np

def custom_plot(x, y, **kwargs):
    ax = kwargs.pop('ax', plt.gca())
    base_line, = ax.plot(x, y, **kwargs)
    ax.fill_between(x, 0.9*y, 1.1*y, facecolor=base_line.get_color(), alpha=0.5)

x = np.linspace(0, 1, 10)
custom_plot(x, x)
custom_plot(x, 2*x)
custom_plot(x, -x, color='yellow', lw=3)

plt.show()

enter image description here

这并不是唯一的方法,但比手动获取绘制线的颜色更干净,在这种情况下。

相关问题 更多 >