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
相关产品推荐
相关产品推荐

