如何使用JFreeChart实现按小时分段、秒级精度的时序图渲染

实现方案(基于JFreeChart 1.5.x版本)
你要的小时分段+秒级精度渲染可以通过DateAxis的主次刻度配置直接实现,不需要自定义复杂逻辑,步骤如下:
1. 准备秒级精度的数据集
使用org.jfree.data.time.Second类封装每个时间点的秒级信息,存入时序数据集:
// 示例:构造秒级时序数据 TimeSeries series = new TimeSeries("监测数据"); // 逐个添加秒级数据点,参数依次为:秒、分、时、日、月、年 series.add(new Second(12, 23, 9, 15, 10, 2024), 23.5); series.add(new Second(13, 23, 9, 15, 10, 2024), 24.1); // ... 其他秒级数据 TimeSeriesCollection dataset = new TimeSeriesCollection(series);
2. 配置X轴(时间轴)的主次刻度
这步是实现小时分段、秒级渲染的核心:
DateAxis xAxis = new DateAxis("时间"); // 配置主刻度:1小时为间隔,作为分段边界显示标签 xAxis.setTickUnit(new DateTickUnit( DateTickUnitType.HOUR, 1, new SimpleDateFormat("yyyy-MM-dd HH:00") )); // 主刻度标记加粗,突出小时分段效果 xAxis.setTickMarkStroke(new BasicStroke(2f)); xAxis.setTickMarkPaint(Color.BLACK); // 配置次刻度:1秒为间隔,用于秒级数据点的渲染对齐,不需要显示标签 xAxis.setMinorTickCount(3600); // 1小时包含3600秒,每个主刻度区间划分3600个次刻度 xAxis.setMinorTickMarksVisible(true); xAxis.setMinorTickPaint(Color.LIGHT_GRAY);
3. 配置渲染器适配秒级精度
直接使用默认的XYLineAndShapeRenderer即可,只要数据集的时间戳正确,会自动匹配到秒级的轴坐标:
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, false); // 可选:打开抗锯齿优化大量秒级点的渲染效果 renderer.setDefaultAntialias(true);
4. 组装图表
XYPlot plot = new XYPlot(dataset, xAxis, new NumberAxis("数值"), renderer); JFreeChart chart = new JFreeChart("时序监测图", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
如果小时区间内的秒级数据点过多,可以按需做采样聚合减少渲染压力,JFreeChart默认会自动适配画布宽度,不会出现点错位的问题。
内容的提问来源于stack exchange,提问作者LiJia
相关产品推荐
相关产品推荐

