我正在尝试使用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);
谢谢你, 约什
答案 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);