发出线形图XAxis学术月订单

时间:2018-08-21 09:04:27

标签: javafx linechart

我创建了一个简单的折线图,用于比较当前年份值和过去几年的值(可以是平均值,也可以不是平均值)。

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图表的漂亮功能吗?

当前使用的资源:

1 个答案:

答案 0 :(得分:1)

因此,我遵循了最初的思考过程,尽管它比我最初想象的要复杂得多,并且间隔了不到6个月,但以下工作却适用于6和8。 以下方法将Jan(1)到Dec(12)重排为偏移顺序,例如6月(1)至5月(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);
        }

    });

numpy.where