如何仅显示“过去72小时”JFreeChart TimeSeries中的“过去24小时”

我写了这两行代码来使用XYDataset创建图表:

 final XYDataset dataset = new TimeSeriesCollection(myInfo.getSeries()); JFreeChart timechart = ChartFactory.createTimeSeriesChart(myInfo.getName() + " CPU (last 72h)", "", "CPU %", dataset, false, false, false); 

这些线创建了这个漂亮的“最后72小时”图表:

最后72小时图表

这是我添加信息以构建此图表的方式(这段代码可以多次运行):

 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd H:mm:ss"); Date date = simpleDateFormat.parse(dateAsStringToParse); Second second = new Second(date); myInfo.getSeries().addOrUpdate(second, maxValue); // maxValue is an Integer 

我想要一个(看似简单的)简单的改动 – 仅在过去24小时内“切断”这个。 我的意思是在图中只看到最近的24小时,就像这样(图中是我使用相同技术制作的不同图表,但信息仅存在于过去24小时):

最后24小时图表

我查看了API并找不到合适的答案,因为我认为这应该有一些聪明但简单的解决方案。

这里建议的不是丢弃旧数据,而是希望显示数据的连续子集,就像在窗口中查看一样。 虽然SlidingCategoryDatasetCategoryDataset提供了此function,但是没有针对XYDataset内置解决方案。 SlidingXYDataset ,在这里看到,也许是另一种选择。 在下面说明的SliderDemo2的变体中,我已经将三天的数据添加到具有一天窗口的单个系列中。 我保留了滑块以便于查看之前的值。

 static final int COUNT = 3 * 24 * 60; public static final int WINDOW = 24 * 60; public static final int FIRST = 2 * 24 * 60; … this.slider.setValue(FIRST); 

图片

另外,请注意,自提交补丁以来,某些类已经移动:

 import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; 

我不能使用setMaximumItemAge()吗?

不是孤立的; addOrUpdate()et al。 ,在通知侦听器之前调用removeAgedItems(false)

我正在使用Second

例如,第二天数据的三天将意味着setMaximumItemAge(3 * 24 * 60 * 60)

我可能无法使用滑动窗口,因为我将图表另存为JPEG。

您可以将所需的firstItemIndex作为参数传递给SlidingXYDataset构造函数; 如果需要,可以稍后通过setFirstItemIndex()更新索引。