Tkinter中如何将多个文本文件的数据绘制在同一图表而不覆盖?
问题分析与解决方法
你的代码只显示最后一个文件数据的核心问题有三个:
- 重复修改同一个绘图对象:你一直在用
self.plot4.set_data(x,y)修改同一个曲线的数据,每次循环都会覆盖上一次的内容,最终只保留最后一次的数据。 - 坐标轴范围被频繁覆盖:每次循环单独设置
xlim和ylim,会把坐标轴范围改成当前文件的极值,导致之前的曲线可能超出范围无法显示。 - 没有执行实际保存操作:
self.canvas.is_saving()只是判断画布是否处于保存状态,不是保存绘图的方法,等于没做保存。
修改方案一:所有文件数据叠加在同一张图中
如果需要把所有文件的曲线放在同一张图里,修改后的代码如下:
def openFile(self): filelist = [] for i in range(2): files = filedialog.askopenfilename() filelist.append(files) # 收集所有文件的坐标数据,用于统一设置坐标轴范围 all_x = [] all_y = [] for fname in filelist: with open(fname) as f: lines = f.readlines() x = [float(line.split(",")[0]) for line in lines] y = [float(line.split(",")[1]) for line in lines] all_x.extend(x) all_y.extend(y) # 每次创建新的曲线,而不是修改已有曲线 self.ax4.plot(x, y, label=f"文件: {fname.split('/')[-1]}") # 统一设置坐标轴范围,确保所有数据都在视图内 self.ax4.set_xlim(min(all_x), max(all_x)) self.ax4.set_ylim(min(all_y), max(all_y)) self.ax4.legend() # 显示图例区分不同文件的曲线 self.canvas.draw_idle() # 保存包含所有曲线的绘图 self.canvas.savefig("所有数据汇总图.png")
关键修改点:
- 用
self.ax4.plot()每次生成新曲线,实现多曲线叠加。 - 收集所有数据后统一设置坐标轴范围,避免部分曲线被裁切。
- 添加图例方便区分不同文件的数据。
- 用
savefig()执行实际的保存操作。
修改方案二:每个文件单独生成一张图
如果需要为每个文件单独保存一张图,修改后的代码如下:
def openFile(self): filelist = [] for i in range(2): files = filedialog.askopenfilename() filelist.append(files) for fname in filelist: with open(fname) as f: lines = f.readlines() x = [float(line.split(",")[0]) for line in lines] y = [float(line.split(",")[1]) for line in lines] # 清空当前轴,准备绘制新文件的图 self.ax4.clear() self.ax4.plot(x, y) self.ax4.set_xlim(min(x), max(x)) self.ax4.set_ylim(min(y), max(y)) self.ax4.set_title(f"数据来自: {fname.split('/')[-1]}") self.canvas.draw_idle() # 根据文件名生成保存路径,避免覆盖 save_filename = f"{fname.rsplit('.', 1)[0]}_绘图.png" self.canvas.savefig(save_filename)
关键修改点:
- 每次循环用
ax4.clear()清空当前绘图区域,绘制新文件的曲线。 - 用原文件名生成保存的图片名,确保每个文件的图都单独保存不被覆盖。
- 添加标题标注数据来源,更直观。
内容的提问来源于stack exchange,提问作者deutscherkaffee
相关产品推荐
相关产品推荐

