ScottPlot调用SaveFig无法生成图片文件问题求助
解决ScottPlot SaveFig无法生成图片的问题
核心问题分析
- 数据赋值错误:代码中
penetration_array错误复用了armor_thickness_list,而非penetration_list,导致X/Y轴数据完全一致,即使生成图片也无实际意义。 - 未执行测试逻辑:仅定义了
Test类和TestPenetration方法,但没有实例化类并调用方法,绘图与保存代码根本未运行。 - 相对路径定位偏差:使用相对路径
"PenetrationTest.png"时,图片会生成在程序工作目录(通常是项目的bin/Debug或bin/Release文件夹),而非代码编辑目录。 - 潜在权限问题:程序可能无当前工作目录的写入权限,导致
SaveFig静默失败。
修正后的完整代码
using ScottPlot; using System.Collections.Generic; using System.Linq; class Test { Armor armor; Projectile projectile; List<float> armor_thickness_list = new List<float>(); List<float> penetration_list = new List<float>(); public void TestPenetration() { armor = new Armor(); projectile = new Projectile(); foreach (int value in Enumerable.Range(1, 10)){ // 修复整数除法问题:强制转为浮点数计算 armor.thickness = value / 10f; armor_thickness_list.Add(armor.thickness); float penetration = armor.CalculatePenetration(armor, projectile); penetration_list.Add(penetration); } // 修正penetration_array的数据源 double[] armor_thickness = armor_thickness_list.Select(x=>(double)x).ToArray(); double[] penetration_array = penetration_list.Select(x=>(double)x).ToArray(); var plt = new ScottPlot.Plot(400,300); plt.AddScatter(armor_thickness, penetration_array); // 添加图表元素提升可读性 plt.Title("装甲厚度与穿深关系"); plt.XLabel("装甲厚度"); plt.YLabel("穿深值"); // 可选:使用绝对路径避免找不到文件 // string savePath = System.IO.Path.Combine(System.AppContext.BaseDirectory, "PenetrationTest.png"); // plt.SaveFig(savePath); plt.SaveFig("PenetrationTest.png"); } } // 确保Armor和Projectile类已正确实现(示例逻辑) class Armor { public float thickness; public float CalculatePenetration(Armor armor, Projectile projectile) { // 替换为你的实际穿深计算逻辑 return armor.thickness * 1.2f; } } class Projectile { // 你的Projectile类属性与方法定义 } // 主程序入口,触发测试逻辑 class Program { static void Main() { Test test = new Test(); test.TestPenetration(); } }
额外排查步骤
- 检查文件位置:运行程序后,到项目的
bin/Debug/net[你的.NET版本]目录下查找生成的图片。 - 权限验证:尝试使用绝对路径(如
@"C:\Temp\PenetrationTest.png"),确保目标文件夹存在且程序有写入权限。 - 数据有效性:确认
CalculatePenetration方法返回合理数值,避免因数据异常导致图表生成失败。 - 版本适配:若使用ScottPlot 5.x,API有变更,需调整为
plt.SavePng()方法,或按新版本要求构造Plot对象。
内容的提问来源于stack exchange,提问作者sillybilly
相关产品推荐
相关产品推荐

