给出XAxis学术月份的折线图

问题描述 投票:0回答:1

我创建了一个简单的折线图,我将当前年份值与过去几年进行比较(可能是平均值还是非平均值)。

Example of the basic chart

问题是,由于这是出于英国学术目的,我希望这些月份从6月到次年6月。

目前我的代码如下:

xAxis.setLabel("Date/Month");
    xAxis.setTickLabelRotation(90);

    xAxis.setAutoRanging(false);
    xAxis.setLowerBound(1);
    xAxis.setUpperBound(12);
    xAxis.setTickUnit(1.0);

    xAxis.setTickLabelFormatter(new StringConverter<Number>() {

        @Override
        public String toString(Number month) {
            logger.debug("Converting " + month);
            return new DateFormatSymbols().getMonths()[month.intValue()-1];
        }

        @Override
        public Number fromString(String string) {
            try {
                Date date = new SimpleDateFormat("MMMM").parse(string);
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                return cal.get(Calendar.MONTH);
            } catch (ParseException ex) {
                logger.error("Parse Exception");
            }
            return  0;
        }

    });


    yAxis.setLabel("Units");

使用简单函数创建系列的位置:

    private XYChart.Series createSeries(String name, List<AccountUtilities> data) {
    XYChart.Series series = new XYChart.Series();
    series.setName(name);
    for (AccountUtilities utility : data) {
        String[] dateParts = utility.getStartdate().split("-");
        Double dateCode = Double.valueOf(dateParts[1]);
        series.getData().add(new XYChart.Data( dateCode , utility.getGasunits()));
    }
    return series;
}

我目前的想法是,我可以将月份重新索引为6月= 1,7月= 2等,以便以正确的顺序将值输入到图表中,然后将它们解码为“正确”值6月= 6当我得到setTickLabelFormatter时它的东西,但这似乎有很长的路要走。

javafx图表有一个漂亮的功能,我错过了吗?

目前使用的资源:

javafx linechart
1个回答
1
投票

所以我遵循了我最初的思考过程,尽管它比我最初认为的更复杂,任何不是6个月的偏移,以下是6和8的工作。以下方法将Jan(1)到Dec(12)重新排序到抵消订单,例如Jun(1)到May(12)所以数据在图表中以所需顺序出现。

private Double getAcademicMonth(String baseDate) {
    Integer dateCode = Integer.valueOf(baseDate);

    //Any month greater than the accounting start month gets shifted by six.
    if (dateCode > offset) { dateCode = dateCode - offset; }
    else { dateCode = dateCode + (12-offset); }

    return dateCode;
}

然后,当绘制图表时,我需要一种手动转换月份,因此我得到了正确的月份标签,这是通过setTickLabelFormatter实现的

    //We have to set tick label formatter now once the offset has been retrieved.
    xAxis.setTickLabelFormatter(new StringConverter<Number>() {

        @Override
        public String toString(Number month) {

            //Shift our months to account for the accounting start month
            int dateCode = month.intValue();
            if (dateCode <= (12 - offset) ) { dateCode = dateCode + offset; }
            else { dateCode = dateCode - (12-offset); }

            Month day = Month.of(dateCode);
            return day.getDisplayName(TextStyle.SHORT, Locale.ENGLISH);

        }

        @Override
        public Number fromString(String string) {
          DateTimeFormatter parser = DateTimeFormatter.ofPattern("MMMM").withLocale(Locale.ENGLISH);
          TemporalAccessor accessor = parser.parse(string);
          return accessor.get(ChronoField.MONTH_OF_YEAR);
        }

    });

The end result with additional data series.

© www.soinside.com 2019 - 2024. All rights reserved.