在Matplotlib中重置颜色周期

2024-05-23 08:04:36 发布

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

假设我有3种交易策略的数据,每种策略都有或没有交易成本。我想在同一个轴上绘制6个变量(3个策略*2个交易成本)的时间序列。我希望用alpha=1linewidth=1绘制“有交易成本”行,而用alpha=0.25linewidth=5绘制“无交易成本”。但我希望每种策略的两个版本的颜色相同。

我想要一些大致如下的东西:

fig, ax = plt.subplots(1, 1, figsize=(10, 10))

for c in with_transaction_frame.columns:
    ax.plot(with_transaction_frame[c], label=c, alpha=1, linewidth=1)

****SOME MAGIC GOES HERE TO RESET THE COLOR CYCLE

for c in no_transaction_frame.columns:
    ax.plot(no_transaction_frame[c], label=c, alpha=0.25, linewidth=5)

ax.legend()

在指定的行上放置什么合适的代码来重置颜色循环,以便在调用第二个循环时“返回到开始位置”?


Tags: columnsinalphaforplot颜色with绘制
3条回答

您可以使用Axes.set_color_cycle将colorcycle重置为原始值。看一下代码,有一个函数可以完成实际工作:

def set_color_cycle(self, clist=None):
    if clist is None:
        clist = rcParams['axes.color_cycle']
    self.color_cycle = itertools.cycle(clist

以及使用它的轴上的方法:

def set_color_cycle(self, clist):
    """
    Set the color cycle for any future plot commands on this Axes.

    *clist* is a list of mpl color specifiers.
    """
    self._get_lines.set_color_cycle(clist)
    self._get_patches_for_fill.set_color_cycle(clist)

这基本上意味着您可以调用set_color_cycle,而不使用None作为唯一参数,它将被替换为rcParams['axes.color_cycle']中的默认循环。

我用下面的代码尝试了一下,得到了预期的结果:

import matplotlib.pyplot as plt
import numpy as np

for i in range(3):
    plt.plot(np.arange(10) + i)

# for Matplotlib version < 1.5
plt.gca().set_color_cycle(None)
# for Matplotlib version >= 1.5
plt.gca().set_prop_cycle(None)

for i in range(3):
    plt.plot(np.arange(10, 1, -1) + i)

plt.show()

Code output, showing the color cycling reset functionality

既然你提到你在使用seaborn,我建议你做的是:

with sns.color_palette(n_colors=3):

    ax.plot(...)
    ax.plot(...)

这会将调色板设置为使用当前活动的颜色周期,但仅使用其中的前三种颜色。这也是一个通用的解决方案,任何时候你想设置一个临时的颜色周期。

请注意,真正需要在with块下的唯一事情是创建Axes对象所做的任何事情(即plt.subplotsfig.add_subplot(),等等)。这仅仅是因为matplotlib颜色循环本身是如何工作的。

做你特别想做的事情,“重置”颜色周期是可能的,但这是一个黑客,我不会在任何类型的生产代码。不过,这就是它可能发生的原因:

f, ax = plt.subplots()
ax.plot(np.random.randn(10, 3))
ax._get_lines.color_cycle = itertools.cycle(sns.color_palette())
ax.plot(np.random.randn(10, 3), lw=5, alpha=.25)

enter image description here

由于@pelson给出的答案使用的是set_color_cycle,而Matplotlib 1.5不赞成这样做,所以我认为使用set_prop_cycle更新他的解决方案版本会很有用:

import matplotlib.pyplot as plt
import numpy as np

for i in range(3):
    plt.plot(np.arange(10) + i)

plt.gca().set_prop_cycle(None)

for i in range(3):
    plt.plot(np.arange(10, 0, -1) + i)

plt.show()

还要注意,我必须将np.arange(10,1,-1)更改为np.arange(10,0,-1)。前者给出的数组只有9个元素。这可能是因为使用了不同的Numpy版本。我的是1.10.2。

编辑:不再需要使用rcParams。感谢@divenex在评论中指出这一点。

相关问题 更多 >

    热门问题