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

WinForms Chart优化请求:基于CSV数据调整X/Y轴显示

优化WinForms图表展示CSV数据

问题背景

现有如下CSV格式数据:

1,1671790171,75
0,1671790182,11
1,1671790193,11
0,1671790212,19
1,1671790239,27
0,1671790248,97
1,1671790342,94
0,1671790361,19
1,1671790368,79
0,1671790408,40
1,1671790417,90
0,1671790432,15

数据字段说明:

  • 第一列:1代表「运行中」,0代表「未运行」
  • 第二列:Linux时间戳
  • 第三列:进程耗时(秒)

已编写基础C# WinForms代码,但需优化图表显示:

  • X轴展示每条记录的日期,且文字垂直排版
  • Y轴明确展示进程耗时

优化后的代码

// 使用OpenFileDialog让用户选择CSV文件
var openFileDialog = new OpenFileDialog
{
    Filter = "CSV files (*.csv)|*.csv"
};

if (openFileDialog.ShowDialog() == DialogResult.OK)
{
    // 清空图表原有内容
    chart1.Series.Clear();
    chart1.ChartAreas.Clear();

    // 创建并配置主图表区域
    var chartArea = new System.Windows.Forms.DataVisualization.Charting.ChartArea("MainArea");
    chart1.ChartAreas.Add(chartArea);

    // 创建单个Series承载所有数据点
    var series = new System.Windows.Forms.DataVisualization.Charting.Series
    {
        Name = "ProcessDuration",
        ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Bar,
        XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.DateTime,
        IsXValueIndexed = true // 确保数据点按顺序展示
    };
    chart1.Series.Add(series);

    // 读取CSV文件并解析数据
    using (var reader = new StreamReader(openFileDialog.FileName))
    {
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(',');

            // 解析字段值
            var working = values[0] == "1";
            var timestamp = long.Parse(values[1]);
            var duration = int.Parse(values[2]);

            // 将时间戳转换为DateTime格式
            var date = DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime;

            // 添加数据点并设置样式
            var point = series.Points.AddXY(date, duration);
            point.Color = working ? Color.Red : Color.Green;
            point.BorderWidth = 0;
            // 设置X轴显示的格式化日期标签
            point.AxisLabel = date.ToString("dd-MM-yyyy HH:mm:ss");
        }
    }

    // 配置X轴:垂直标签、字体、标题
    var xAxis = chart1.ChartAreas["MainArea"].AxisX;
    xAxis.LabelStyle.Angle = 90; // 实现文字垂直排版
    xAxis.LabelStyle.Font = new Font("Arial", 8);
    xAxis.Title = "记录时间";
    xAxis.MajorGrid.Enabled = false; // 关闭X轴网格线,提升可读性

    // 配置Y轴:标题、起始值、网格线
    var yAxis = chart1.ChartAreas["MainArea"].AxisY;
    yAxis.Title = "进程耗时(秒)";
    yAxis.Minimum = 0; // Y轴从0开始,避免数据展示截断
    yAxis.MajorGrid.LineColor = Color.LightGray;
}

关键修改说明

  • 合并Series:不再为每条记录单独创建Series,改用单个Series承载所有数据点,确保X轴能正确聚合展示所有日期标签。
  • X轴垂直排版:通过xAxis.LabelStyle.Angle = 90实现标签垂直显示,搭配小字体避免文字重叠。
  • 自定义X轴标签:直接为每个数据点设置AxisLabel属性,指定格式化后的日期字符串,保证显示内容符合需求。
  • 图表区域优化:新增独立ChartArea并配置X/Y轴的标题、网格线,提升整体视觉清晰度。
  • Y轴准确性:设置Y轴最小值为0,确保耗时数据的展示符合实际数值范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:16:09