如何在Matplotlib中为不同线条设置颜色并合并多幅图表
解决方案
修改思路
- 将核心绘图逻辑(
plt.plot)保留在循环内,把图例设置、图表保存与显示的代码移到循环外部,确保所有科目折线都绘制在同一画布上。 - 利用Matplotlib内置的颜色循环自动为每条折线分配不同颜色,也可自定义配色方案提升区分度。
修改后的代码
import matplotlib.pyplot as plt materias = ["MAT 1","MAT 2","MAT 3","FIS 1","FIS 2","FIS 3","QUI 1","QUI 2","GEO 1","GEO 2","PORT","RED","LIT","ART","ING","HIST 1","HIST 2","FIL","SOC","EDF","BIO 1","BIO 2","BIO 3"] # 初始化画布,可自定义大小提升可读性 plt.figure(figsize=(12, 8)) # 循环绘制所有科目折线 for materia in materias: plt.plot(df["PROVAS"], df[materia], label=materia) # 配置图表元素 plt.title("各科目考试成绩趋势") plt.xlabel("考试场次") plt.ylabel("成绩") # 将图例放在图表外侧,避免遮挡折线 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() # 自动调整布局,防止图例被截断 # 保存并显示合并后的图表 plt.savefig('images/all_materias.png', bbox_inches='tight') plt.show()
补充说明
- 合并图表原理:原代码每次循环都调用
plt.show()和plt.savefig(),会强制生成新画布。调整后所有折线都绘制在同一个初始画布上,最终一次性输出合并图表。 - 自定义配色方案:如果需要更个性化的颜色,可使用Matplotlib的颜色映射生成配色列表,示例如下:
# 选用tab20配色方案,包含20种区分度高的颜色 colors = plt.cm.tab20.colors for idx, materia in enumerate(materias): # 循环使用配色,避免科目数量超过颜色数时出错 plt.plot(df["PROVAS"], df[materia], label=materia, color=colors[idx % len(colors)])
内容的提问来源于stack exchange,提问作者Caio Henrique Gavazza Patriota
相关产品推荐
相关产品推荐

