在JFreeChart中为一周的单位创建自定义DateTickUnitType

时间:2011-11-04 14:21:54

标签: jfreechart

据我所知,DateTickUnitType是一个枚举,无法在直接替换之外扩展或更改,它只指定DAY,MONTH,YEAR,MINUTE,HOUR,SECOND和MILLISECOND的单位,但不指定WEEK,尽管有一个周类型的TimePeriod。

这导致的问题是当我被迫使用DAY tick单位绘制一周的单个数据点时,与绘制DAY tick单位或每月数据的每日点相比,我的条宽度相当窄指向MONTH刻度单位。

根据我的数据范围(我以编程方式计算),我使用最合适的TimePeriod创建TimeSeriesDataItem:

// create the correct TimeSeriesDataItem based on the gap of this data set
switch (gap) {
case WEEK:
    item = new TimeSeriesDataItem(new Week(targetDate.getTime()), dataPoint);
    break;
case DAY:
    item = new TimeSeriesDataItem(new Day(targetDate.getTime()), dataPoint);
    break;
case MONTH:
default:
    item = new TimeSeriesDataItem(new Month(targetDate.getTime()), dataPoint);
    break;
}

然后在构建图表之后,我尝试自定义它以使每个数据点的条形尽可能宽。如果数据是天数,则单位为天数。如果数据是月份,则单位为月份。但如果数据是几周,那么由于没有工作单位,我不得不花费数天或数月的时间。

JFreeChart barChart = ChartFactory.createXYBarChart(
    model.getTitle(), 
    model.getDomainTitle(), 
    true,
    model.getRangeTitle(), 
    dataset, 
    model.getOrientation() == SimpleBarChartModel.Orientation.VERTICAL ? PlotOrientation.VERTICAL : PlotOrientation.HORIZONTAL, 
    model.getShowLegend(), 
    false, 
    false);

// ...

DateAxis domainAxis = (DateAxis)plot.getDomainAxis();
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
if (model.getDomainLabels() != null && model.getDomainLabels().size() > 1) {
    // create three different sets of TickUnits for the three ranges (day, week, month)
    // JFreeChart will select the smallest unit that doesn't overlap labels.
    TickUnits tickUnits = new TickUnits();
    tickUnits.add(new DateTickUnit(DateTickUnitType.MONTH, 1, new SimpleDateFormat("MMM")));
    tickUnits.add(new DateTickUnit(DateTickUnitType.DAY, 7, dateFormat));
    tickUnits.add(new DateTickUnit(DateTickUnitType.DAY, 1, dateFormat));
    domainAxis.setStandardTickUnits(tickUnits);
}
domainAxis.setAutoRange(true);
domainAxis.setVerticalTickLabels(true);
domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);

前者创建非常细的条形,因为它每个刻度单位绘制7列。

我有没有办法为WEEK制作一个自定义DateTickUnitType,这样我每周只能绘制一个点而不是7个点(因为我只有一个数据点)?

1 个答案:

答案 0 :(得分:3)

对于DynamicTimeSeriesCollection,您可以使用WEEK显示的MILLISECOND方法添加{{1}}。另请参阅此后续here,其中提到了所选时期的倍数。