小能豆

在 Python 中使用多色线绘制时间序列

py

这是我的数据集:

import pandas as pd
from datetime import datetime
import numpy as np

date_rng = pd.date_range(start='2020-07-01', end='2020-07-20', freq='d')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng))).cumsum()
df['Signal'] = [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1] 

我想根据“信号”列为线条着色,例如,如果信号 = 0,则线条着色为蓝色,如果信号 = 1,则线条着色为橙色。

我尝试使用 seaborn 进行以下操作,但这不是我想要的。我想要一条线,包含两种颜色。

sns.lineplot(data=df, x="date", y="data", hue="Signal")

fltMr.png


阅读 24

收藏
2024-11-26

共1个答案

小能豆

为了实现根据Signal列为单一线条上不同部分着色的效果,你可以使用 matplotlib 来分段绘制线条,按照Signal列的值为每段线条着色。seabornhue 参数只能为整个线条应用颜色,因此它不能实现你想要的逐段着色效果。

以下是如何使用 matplotlib 绘制带有不同颜色的分段线条的示例代码:

代码示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建数据
date_rng = pd.date_range(start='2020-07-01', end='2020-07-20', freq='d')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0, 100, size=(len(date_rng))).cumsum()
df['Signal'] = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

# 绘制带有颜色的线条
plt.figure(figsize=(10,6))

# 循环遍历Signal列
for i in range(1, len(df)):
    # 选择前一行和当前行的日期和数据
    x = df['date'][i-1:i+1]
    y = df['data'][i-1:i+1]

    # 根据信号的值来选择颜色
    if df['Signal'][i] == 0:
        plt.plot(x, y, color='blue')  # 如果Signal=0,使用蓝色
    else:
        plt.plot(x, y, color='orange')  # 如果Signal=1,使用橙色

# 添加标签和标题
plt.xlabel('Date')
plt.ylabel('Data')
plt.title('Line Plot with Colored Segments Based on Signal')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

解释:

  • for i in range(1, len(df)):我们从第二个数据点开始迭代,以便每次取出当前数据点和前一个数据点一起画线段。
  • plt.plot(x, y, color='blue')plt.plot(x, y, color='orange'):根据 Signal 列的值来决定线段的颜色。
  • 通过这种方式,你可以实现根据信号(Signal 列)为同一条线的不同部分着色的效果。

输出:

这将产生一条由多个不同颜色的线段组成的折线图,Signal = 0 的部分将是蓝色,而 Signal = 1 的部分将是橙色。

2024-11-26