如何在jfreecharts中绘制带有时间序列的图表,而不为我插入数据值?

时间:2009-09-26 01:10:39

标签: java charts jfreechart bar-chart

我正在尝试使用JFreechart在XYBarChart上显示数据。图表应显示时间点和计数。因此,如果用户选择1月25日和3月25日作为范围,则图表应以特定间隔显示这些日期之间的数据:

如果用户选择了HOUR,那么我会创建一个从1月25日到3月10日每小时的集合,以及相应的计数。当然,这是一个非常大的收藏。如果用户选择MONTH,则用户应该看到3个月(并且集合中只有3个条目)。如果用户选择DAY,则用户只能看到大约60个条目。你看?

当我创建图表时(使用下面的代码生成数据集),它会'插值'值。如果我选择小时,它会按天显示数据,每天之间有很多条形(即一天内有24个小条)。如果我选择了几个月,我仍然可以获得2个月的日子,但是我得到了一个涵盖了这个月所有日子的巨大区块。如果我选择DAY,它看起来没问题。

如何让jfreecharts停止插值并只绘制一个图表,其中1:1映射到我给它的数据。如果我给它两个月的两个条目并给它一个Month.class的RegularTimePeriod,只显示两个带有两个标签和两个值的条形图。如果我在几个月的时间内给它1000小时,那么每小时都会显示标签和计数,等等......

TimeSeries timeSeries = new TimeSeries(title, "Blah", "blah", clazz);  
// clazz is one of Day.class, Month.class, Hour.class 
for (final ReportRecord reportRecord : records) {
 int count = reportRecord.getCount();
 Date start = reportRecord.getDateRange().getStart();
 RegularTimePeriod period = null;
 switch (type) {
  case DAY: period = new Day(start);  break;
  case MONTH: period = new Month(start); break; 
  case HOUR: period = new Hour(start); break;
 }
 timeSeries.add(new TimeSeriesDataItem(period, count));
}
return new TimeSeriesCollection(timeSeries);

谢谢你, 约什

1 个答案:

答案 0 :(得分:0)

对我来说,jfreechart就像你问的那样。例如,当你说:

“如果我选择小时,它会按天显示数据,每天之间有很多小节(即一天内有24个小小的酒吧)。”

您提供的代码每小时都会在集合中添加一个项目,因此每小时需要一个单独的小条。

如果您将集合添加逻辑更改为仅在您决定时添加值(例如每天午夜一次),那么它应该只在相关日期的图表中生成一个条形。

在过去,我只是将值调到最近的秒(不是你需要那么准确),jfreechart会处理剩下的事情,具体取决于你选择的时间尺度(以编程方式或交互方式)。 / p>

如:

        TimeSeriesCollection dataset = new TimeSeriesCollection();
        TimeSeries series = new TimeSeries("Basal", Second.class);
        for (BasalRate basal : pInsulin.basals) {
            Second lSecond = new Second(basal.getTime());
            series.addOrUpdate(lSecond, basal.getValue());
        }
        dataset.addSeries(series);