据我所知,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个点(因为我只有一个数据点)?
答案 0 :(得分:3)
对于DynamicTimeSeriesCollection
,您可以使用WEEK
显示的MILLISECOND
方法添加{{1}}。另请参阅此后续here,其中提到了所选时期的倍数。