グラフは画像上のドットに色を1点ずつつけて作成しているので、matplotlib に「y の値に応じて、色を変えた折れ線を作成する関数」そのものはないですが、scatter() で画像を十分敷き詰められる点を描画することで実質、折れ線が作成できます。
色分けは既存のカラーマップを使うか、色分けする y の値の境界を明示的に指定したい場合は自作カラーマップを作ればよいです。
python
1import matplotlib.pyplot as plt
2import numpy as np
3import matplotlib as mpl
4
5
6fig, ax = plt.subplots()
7
8# [0, 20) は赤、[20, 50) は緑、.... という意味
9cmap = mpl.colors.ListedColormap(["red", "green", "blue", "cyan", "pink"])
10bounds = [0, 20, 50, 60, 90, 100]
11
12x = np.linspace(-10, 10, 5000) # 画像を十分敷き詰められる点を作成する。例えば、5000とか大きい値にすればよい
13y = x ** 2
14
15# s が線の太さ
16plt.scatter(x, y, s=5, c=y, cmap=cmap, edgecolor="none")
以下の質問を参考にしました。
color mapping - Change colour of curve according to its y-value in matplotlib - Stack Overflow
追記
回答したあとに気づきましたが、すでにあるデータから色わけした直線を作成する場合は中間値のyの値を計算しておく必要がありますね。
python
1import matplotlib as mpl
2import matplotlib.pyplot as plt
3import numpy as np
4import pandas as pd
5
6# 以下のようなデータが与えられたとする。
7x = pd.date_range("2012-01-01", "2013-02-22")
8y = np.random.choice([-1, 1], len(x)).cumsum()
9df = pd.DataFrame({"date": x, "value": y}).set_index("date")
10df.plot()
11plt.show()
12
13
14# データの各要素間の値を線形補完する。
15df = df.reindex(
16 pd.date_range(start=df.index.min(), end=df.index.max(), freq="h")
17).interpolate()
18
19# 描画する。
20fig, ax = plt.subplots()
21
22cmap = mpl.colors.ListedColormap(["red", "green", "blue", "cyan", "pink"])
23bounds = [-50, -20, -10, 10, 20, 50]
24
25plt.scatter(df.index, df["value"], s=3, c=df["value"], cmap=cmap, edgecolor="none")
26plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/21 00:34