0

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

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

当我创建图表(使用下面的代码生成数据集)时,它会“插入”这些值。如果我选择小时,它将按天显示数据,每天之间有许多条(即一天内有 24 个小条)。如果我选择月份,我仍然会得到 2 个月的天数,但我会得到一个覆盖一个月所有天数的大块。如果我选择 DAY,它看起来还不错。

我怎样才能让 jfreecharts 停止插值并绘制一个 1:1 映射到我给它的数据的图表。如果我给它两个 2 个月的条目并给它一个 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);

谢谢你,乔什

4

1 回答 1

0

在我看来,jfreechart 正在按照您的要求进行操作。例如,当你说:

“如果我选择小时,它会按天显示数据,每天之间有许多条(即一天中有 24 个小条)。”

您提供的代码每小时将一个项目添加到集合中,因此每个小时都有一个单独的小条是合适的。

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

在过去,我只是简单地将值插入到最接近的秒数(不是您需要那种准确性),而 jfreechart 将根据您选择的时间尺度(以编程方式或交互方式)来处理其余的事情。

如:

        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);
于 2009-09-28T08:24:05.770 回答