如何在Matplotlib中实现混合线型与自定义颜色的折线图
实现自定义颜色与线型的客户消费折线图
需求:基于Pandas DataFrame绘制折线图,同一张图中为不同客户设置自定义颜色;同时根据单周消费金额区分线型:消费≥100标记为Premium(实线),否则为Standard(虚线)。
完整实现代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 初始化数据 data = {'Date': ['9/1/2024', '9/8/2024', '9/15/2024', '9/22/2024', '9/27/2024', '10/3/2024', '9/1/2024', '9/8/2024', '9/15/2024', '9/22/2024', '9/27/2024', '10/3/2024', '9/1/2024', '9/8/2024', '9/15/2024', '9/22/2024', '9/27/2024', '10/3/2024'], 'Customer': ['Customer A', 'Customer A', 'Customer A', 'Customer A', 'Customer A', 'Customer A', 'Customer B', 'Customer B', 'Customer B', 'Customer B', 'Customer B', 'Customer B', 'Customer C', 'Customer C', 'Customer C', 'Customer C', 'Customer C', 'Customer C'], 'Spend': [100, 200, 10, 150, 180, 200, 100, 200, 10, 15, 200, 200, 100, 200, 10, 10, 300, 150], 'Color': ['Red', 'Red', 'Red', 'Red', 'Red', 'Red', 'Orange', 'Orange', 'Orange', 'Orange', 'Orange', 'Orange', 'Yellow', 'Yellow', 'Yellow', 'Yellow', 'Yellow', 'Yellow']} # 创建DataFrame并预处理 df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) # 转换为日期格式,确保绘图顺序正确 df['PurchaseType'] = np.where(df['Spend'] >= 100, 'Premium', 'Standard') # 重命名类型更清晰 # 初始化绘图 plt.figure(figsize=(10, 6)) # 按客户分组处理 for customer, group in df.groupby('Customer'): # 按日期排序,保证时间序列正确 group_sorted = group.sort_values('Date') # 获取该客户的自定义颜色(所有行颜色一致,取第一个即可) customer_color = group_sorted['Color'].iloc[0] # 获取日期和消费数据 dates = group_sorted['Date'] spends = group_sorted['Spend'] types = group_sorted['PurchaseType'] # 遍历相邻数据点,绘制每一段线段 for i in range(len(dates) - 1): # 选择线型:Premium用实线('-'),Standard用虚线('--') linestyle = '-' if types.iloc[i+1] == 'Premium' else '--' # 绘制当前段的折线,仅第一段添加图例标签避免重复 plt.plot(dates[i:i+2], spends[i:i+2], color=customer_color, linestyle=linestyle, label=customer if i == 0 else "") # 添加图表元素 plt.legend(title='Customer') plt.xlabel('Date') plt.ylabel('Weekly Spend') plt.title('Customer Weekly Spend Trend (Custom Color & Line Style)') plt.xticks(rotation=45) plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
关键实现说明
数据预处理
- 把
Date字符串转为datetime格式,避免字符串排序导致的时间顺序混乱,保证折线按时间先后绘制。 - 将原代码的
A/B重命名为Premium/Standard,让逻辑更直观易懂。
- 把
分组绘制逻辑
- 按客户分组后,每个客户使用其专属的自定义颜色(同一客户的
Color列值一致,直接取第一个即可)。 - 遍历每个客户的相邻数据点,每一段折线的线型由该段结束周的消费类型决定:Premium对应实线,Standard对应虚线,完美匹配每周的消费等级要求。
- 仅在绘制每个客户的第一段线段时添加图例标签,避免图例中出现重复的客户名称。
- 按客户分组后,每个客户使用其专属的自定义颜色(同一客户的
内容的提问来源于stack exchange,提问作者Kathleen Wong
相关产品推荐
相关产品推荐

