这是我的数据集:
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")
为了实现根据Signal列为单一线条上不同部分着色的效果,你可以使用 matplotlib 来分段绘制线条,按照Signal列的值为每段线条着色。seaborn 的 hue 参数只能为整个线条应用颜色,因此它不能实现你想要的逐段着色效果。
Signal
matplotlib
seaborn
hue
以下是如何使用 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 = 0 的部分将是蓝色,而 Signal = 1 的部分将是橙色。
Signal = 0
Signal = 1