<h3>访问颜色循环迭代器</h3>
<p>没有“面向用户”(也称为“public”)方法来访问底层迭代器,但是您可以通过“private”(按惯例)方法访问它。但是,如果不更改它,就无法获取<code>iterator</code>的状态。</p>
<h3>设置颜色周期</h3>
<p>快速旁白:您可以通过多种方式设置颜色/属性循环(例如,<code>ax.set_color_cycle</code>在versions<;1.5或<code>ax.set_prop_cycler</code>在>;=1.5中)。看看<a href="http://matplotlib.org/examples/color/color_cycle_demo.html" rel="noreferrer">example here for version 1.5 or greater</a>,或者<a href="http://matplotlib.org/1.4.3/examples/color/color_cycle_demo.html" rel="noreferrer">previous style here</a>。</p>
<h3>访问底层迭代器</h3>
<p>然而,虽然没有面向公共的方法来访问iterable,但是您可以通过<code>_get_lines</code>helper类实例来访问给定axes对象(<code>ax</code>)的iterable。<code>ax._get_lines</code>是一个很容易混淆的名字,但它是幕后机器,允许<code>plot</code>命令处理所有可以调用<code>plot</code>的奇怪和多样的方式。除此之外,它还可以跟踪要自动分配的颜色。类似地,还有<code>ax._get_patches_for_fill</code>来控制通过默认填充颜色和修补程序属性的循环。</p>
<p>无论如何,线的颜色周期是<code>ax._get_lines.color_cycle</code>,补丁是<code>ax._get_patches_for_fill.color_cycle</code>。在matplotlib>;=1.5上,这已更改为<a href="http://matplotlib.org/cycler/" rel="noreferrer">use the ^{<cd12>} library</a>,iterable被称为<code>prop_cycler</code>,而不是<code>color_cycle</code>,并生成属性的<code>dict</code>,而不是仅生成颜色。</p>
<p>总的来说,你会做如下事情:</p>
<pre><code>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']
</code></pre>
<h3>无法查看<code>iterator</code></h3>的状态
<p>然而,这个对象是一个“裸的”<code>iterator</code>。我们可以很容易地得到下一个项目(例如<code>next_color = next(color_cycle)</code>),但这意味着在这个<e em>之后的下一个颜色<em>将被绘制出来。根据设计,如果不更改迭代器的当前状态,就无法获取它。</p>
<p>在<code>v1.5</code>或更高版本中,最好获得使用的<code>cycler</code>对象,因为我们可以推断其当前状态。但是,<code>cycler</code>对象本身在任何地方都不可访问(公开或私下)。相反,只有从<code>cycler</code>对象创建的<code>itertools.cycle</code>实例是可访问的。不管怎样,都无法到达颜色/属性循环器的基本状态。</p>
<h3>匹配先前打印项的颜色,而不是</h3>
<p>在你的例子中,听起来你想匹配刚刚绘制的东西的颜色。不要试图确定颜色/属性是什么,而是根据打印内容的属性设置新项的颜色/等。</p>
<p>例如,在你所描述的情况下,我会这样做:</p>
<pre><code>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()
</code></pre>
<p><img src="https://i.stack.imgur.com/w4hOV.png" alt="enter image description here"/></p>
<p>这并不是唯一的方法,但比手动获取绘制线的颜色更干净,在这种情况下。</p>