如何为Matplotlib多温度散点图设置不同颜色与独立图例?
解决多组散点图颜色单一、图例重复问题
直接给你针对性的修改方案和代码示例:
核心问题分析
- 所有散点蓝色:循环绘制时未指定不同颜色,默认使用Matplotlib的初始配色
- 图例重复:每次循环都调用
legend(),或图例标签未正确关联每组数据
修改步骤与代码示例
1. 准备颜色集合
用Matplotlib内置的配色方案(比如tab10,适合10组以内的分类),或者自定义颜色列表,确保每组数据对应不同颜色。
2. 循环绘制时绑定颜色与标签
循环遍历每个温度分组,用索引匹配颜色,同时给每组散点设置唯一标签,最后统一添加图例(只调用一次)。
完整修改代码(含Tkinter文件选择)
import pandas as pd import matplotlib.pyplot as plt from tkinter import Tk, filedialog # 弹出文件选择框读取Excel root = Tk() root.withdraw() file_path = filedialog.askopenfilename(filetypes=[("Excel文件", "*.xlsx;*.xls")]) df = pd.read_excel(file_path) # 获取所有唯一温度值 unique_temps = df['温度'].unique() # 用Matplotlib内置的tab10配色,自动生成区分度高的颜色 color_list = plt.cm.tab10.colors # 创建画布 plt.figure(figsize=(10, 6)) # 遍历每个温度分组,用索引对应颜色 for idx, temp in enumerate(unique_temps): # 筛选当前温度的数据 temp_data = df[df['温度'] == temp] # 绘制散点:指定颜色、设置对应标签 plt.scatter(temp_data['X列名'], temp_data['Y列名'], color=color_list[idx % len(color_list)], # 颜色循环避免越界 label=f"{temp}℃") # 循环结束后统一添加一次图例 plt.legend(title="温度分组", loc="upper right") # 添加坐标轴标签和标题 plt.xlabel("X轴名称") plt.ylabel("Y轴名称") plt.title("不同温度下的散点分布") plt.show()
嵌入Tkinter窗口的版本(如果你的代码是在GUI里显示)
import pandas as pd import matplotlib.pyplot as plt from tkinter import Tk, filedialog from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg root = Tk() root.title("温度散点图") # 读取Excel数据 root.withdraw() file_path = filedialog.askopenfilename(filetypes=[("Excel文件", "*.xlsx;*.xls")]) df = pd.read_excel(file_path) root.deiconify() unique_temps = df['温度'].unique() color_list = plt.cm.tab10.colors # 创建Matplotlib图和轴 fig, ax = plt.subplots(figsize=(10, 6)) for idx, temp in enumerate(unique_temps): temp_data = df[df['温度'] == temp] ax.scatter(temp_data['X列名'], temp_data['Y列名'], color=color_list[idx % len(color_list)], label=f"{temp}℃") # 设置图例和标签 ax.legend(title="温度分组") ax.set_xlabel("X轴名称") ax.set_ylabel("Y轴名称") ax.set_title("不同温度下的散点分布") # 把图嵌入Tkinter窗口 canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() canvas.get_tk_widget().pack(fill="both", expand=True) root.mainloop()
关键注意点
- 替换代码中的
X列名、Y列名为你Excel里实际的列标题 - 如果温度分组超过10个,可换用
tab20配色(plt.cm.tab20.colors),或者自定义颜色列表(比如color_list = ['#FF5733', '#33FF57', '#3357FF', ...]) - 绝对不要在循环内部调用
legend(),否则会重复生成图例
内容的提问来源于stack exchange,提问作者Mhmoud Khadija
相关产品推荐
相关产品推荐

