1. ホーム
  2. python

Matplotlib で色サイクルをリセットする

2023-10-04 11:45:55

質問

3つの取引戦略のデータがあり、それぞれ取引コストがあるものとないものがあるとします。 同じ軸に、6つのバリエーション(3つの戦略 * 2つの取引コスト)のそれぞれの時系列をプロットしたいと思います。 取引コストありの線は次のようにプロットしたいと思います。 alpha=1linewidth=1 でプロットしたいのに対して、quot;取引コストなしは 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()

2番目のループが呼び出されたときに、カラーサイクルをリセットして、"スタート"に戻るように、指示された行に置く適切なコードは何ですか?

どのように解決するのですか?

カラーサイクルを元に戻すには、以下の方法で行います。 Axes.set_color_cycle . このためのコードを見ると、実際の作業を行うための関数があります。

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

そして、それを利用するAxes上のメソッド。

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)

これは基本的に、Noneを唯一の引数としてset_color_cycleを呼び出すと、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()

<イグ