如何为子图中时间序列与滚动均值线条设置不同颜色?
解决子图中时间序列与滚动均值线条独立设色的问题
我明白你遇到的困扰了——直接在子图的plot()里设置color参数,会让该子图里所有线条都继承这个颜色,没法分别给原始序列和滚动均值指定不同色调对吧?其实解决思路很简单:给每条单独的线条在绘制时单独指定颜色,而非在子图层面统一设置。
下面给你一个具体的实现示例,假设你的数据集是df,我们要为每一列生成独立子图,其中第二列(gym)的原始序列用紫色,滚动均值用红色,其他子图也可以自定义不同的颜色组合:
import matplotlib.pyplot as plt import pandas as pd # 先计算滚动均值(这里以窗口大小7为例,可根据需求调整) rolling_df = df.rolling(window=7).mean() # 创建子图布局:行数等于数据列数,列数为1,共享x轴让时间序列对比更清晰 fig, axes = plt.subplots(nrows=len(df.columns), ncols=1, figsize=(10, 6*len(df.columns)), sharex=True) # 定义每个列对应的颜色对(原始序列色,滚动均值色),第二组对应gym的紫色+红色 color_pairs = [ ('deepskyblue', 'darkorange'), # 第一列的颜色组合 ('purple', 'red'), # 第二列(gym)的颜色组合,完全匹配你的需求 ('forestgreen', 'saddlebrown'), # 第三列的颜色组合,可自由修改 # 更多列的颜色对可以继续添加 ] # 遍历每个子图、数据列和对应的颜色对 for ax, col, (color_raw, color_roll) in zip(axes, df.columns, color_pairs): # 绘制原始时间序列,单独指定颜色 ax.plot(df.index, df[col], color=color_raw, label=f'{col} 原始序列') # 绘制滚动均值,指定另一种颜色 ax.plot(rolling_df.index, rolling_df[col], color=color_roll, label=f'{col} 滚动均值') # 添加子图标题和图例,提升可读性 ax.set_title(f'{col} 时间序列与滚动均值') ax.legend() # 自动调整子图间距,避免标题和标签重叠 plt.tight_layout() plt.show()
核心逻辑说明:
- 没有在子图对象
ax上统一设置颜色,而是在每次调用plot()时,通过color参数单独指定当前线条的颜色,这样原始序列和滚动均值就能拥有完全独立的色调。 color_pairs列表可以根据你的需求自由扩展,每一组对应一个数据列的两种线条颜色,完全满足你“子图中线条颜色各不相同”的要求。- 使用
sharex=True让所有子图共享x轴,既节省图表空间,也让不同列的时间序列对比更直观。
如果是用seaborn等其他库绘图,思路也是一致的:分别调用绘图函数,给每个线条单独传入颜色参数即可。
内容的提问来源于stack exchange,提问作者PollPenn
相关产品推荐
相关产品推荐

