如何基于月份为Matplotlib多线图按日期配色?
按月份从色图为Matplotlib曲线配色的简便方法
核心思路
不用循环迭代器硬选色,而是先把每条曲线对应的月份值归一化,直接从Matplotlib色图中映射出对应颜色,实现按月份而非绘图顺序配色。
实现步骤及代码
1. 数据预处理(用Pandas简化操作)
先把数据读入,解析日期,按日期分组(每条曲线对应同一天的数据),同时提取每条曲线对应的月份:
import pandas as pd import matplotlib.pyplot as plt from matplotlib import cm from matplotlib.colors import Normalize # 读入数据(假设数据存为data.csv,也可直接用字符串读取) data = pd.read_csv('data.csv', sep='\s+', parse_dates=['DATE (YYYY-MM-DDTHH:MI:SSZ)']) data.rename(columns={'DATE (YYYY-MM-DDTHH:MI:SSZ)': 'date'}, inplace=True) # 按日期分组,获取每条曲线的数据 groups = data.groupby(data['date'].dt.date) # 提取每条曲线对应的月份(如11月、12月) months = [date.month for date, _ in groups]
2. 建立月份到颜色的映射
把月份值归一化到[0,1]区间,然后用选定的色图生成对应颜色:
# 归一化月份值到0-1区间 norm = Normalize(vmin=min(months), vmax=max(months)) # 选择色图(可替换为plasma、coolwarm等内置色图) cmap = cm.get_cmap('viridis') # 生成每条曲线对应的颜色 colors = [cmap(norm(month)) for month in months]
3. 绘图并应用颜色
遍历分组数据,用对应颜色绘制A-B曲线:
plt.figure(figsize=(10,6)) # 同时遍历分组数据和对应颜色 for (date, group), color in zip(groups, colors): plt.plot(group['A'], group['B'], label=f'{date}', color=color) plt.xlabel('变量A') plt.ylabel('变量B') plt.title('按月份配色的A-B曲线') plt.legend(title='日期') # 可选:添加颜色条,直观展示月份与颜色的对应关系 sm = cm.ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) plt.colorbar(sm, label='月份') plt.show()
关键说明
- 若数据跨年份,可把月份替换为
date.to_period('M')(如2019-11、2020-01),再转换为数值进行归一化 - 色图可根据需求自由替换,直接使用Matplotlib内置色图名称即可
- 颜色条能帮助观察者快速对应颜色与月份的关系,建议添加
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

