You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

额外排查步骤

  1. 检查文件位置:运行程序后,到项目的bin/Debug/net[你的.NET版本]目录下查找生成的图片。
  2. 权限验证:尝试使用绝对路径(如@"C:\Temp\PenetrationTest.png"),确保目标文件夹存在且程序有写入权限。
  3. 数据有效性:确认CalculatePenetration方法返回合理数值,避免因数据异常导致图表生成失败。
  4. 版本适配:若使用ScottPlot 5.x,API有变更,需调整为plt.SavePng()方法,或按新版本要求构造Plot对象。

内容的提问来源于stack exchange,提问作者sillybilly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:28