Отображение каждой точки (xy val) на оси jfreechart - PullRequest
0 голосов
/ 12 сентября 2018

Я не нашел решения для своей проблемы: я пытаюсь составить график доступности услуг.Это должен быть график «статус за время».Для каждого интервала доступности программа создает другую серию в зависимости от статуса и добавляет ее в набор данных.Я выбрал диаграмму площади, потому что мне нужно сделать ее максимально похожей на систему Nagios.

Основная проблема: значения по оси x отображаются с интервалом 12 часов.Я не хочу этого вообще.Я хочу только указать, когда какой-то статус начинался с полных данных в формате: гггг-мм-дд чч: мм: сс.Как в примере:

enter image description here Я попытался изменить формат с помощью:

dateAxis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));

, но затем на оси x отображаются только 2 значения, все заканчиваются нато же самое чч: мм: сс, например, 12:00:00, как показано ниже: enter image description here

Поэтому мой вопрос заключается в том, как получить диаграмму, которая будет отображать только x значений, упомянутых в серии, в надлежащем формате(как на 1-м графике - 3 даты, когда какое-то событие началось) и не будут добавлять стандартные интервалы (например, 12 часов).И мой код:

public class HistogramExample extends ApplicationFrame {
    private static final long serialVersionUID = 1L;

    public HistogramExample(String title) {
        super(title);

    }

    public static void main(String[] args) throws ParseException {

        TimePeriodValuesCollection dataset = new TimePeriodValuesCollection();

        dataset.addSeries(getNewSeries("2018-07-01 02:02:02", "2018-07-31 09:31:39", 3));
        dataset.addSeries(getNewSeries("2018-07-31 09:31:40", "2018-08-05 00:00:00", 1));
        dataset.addSeries(getNewSeries("2018-08-05 00:00:00", "2018-08-07 00:00:00", 3));

        JFreeChart chart = ChartFactory.createXYAreaChart("Test", // Title
                "x-axis", // x-axis Label
                "y-axis", // y-axis Label
                dataset, // Dataset
                PlotOrientation.VERTICAL, // Plot Orientation
                false, // Show Legend
                false, // Use tooltips
                false // Configure chart to generate URLs?
        );
        chart.getPlot().setBackgroundPaint(Color.WHITE);
        XYPlot plot = chart.getXYPlot();
        XYItemRenderer renderer = plot.getRenderer();
        renderer.setSeriesPaint(0, Color.green);
        renderer.setSeriesPaint(1, Color.RED);
        renderer.setSeriesPaint(2, Color.green);
        String[] grade = new String[4];
        grade[0] = "Interminate";
        grade[1] = "Unreachable";
        grade[2] = "Down";
        grade[3] = "Up";
        // UP cz0 z 105 CR 255 UKNO C255 Z 100 N 25 Warr czerw 255 ziel 255
        SymbolAxis rangeAxis = new SymbolAxis("", grade);
        rangeAxis.setGridBandsVisible(false);
        rangeAxis.setTickUnit(new NumberTickUnit(1));
        rangeAxis.setRange(0, 3);
        rangeAxis.setAxisLineVisible(false);

        DateAxis dateAxis = new DateAxis();
        dateAxis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);

        dateAxis.setMinimumDate(formatter.parse("2018-07-01 02:02:02"));
        dateAxis.setMaximumDate(formatter.parse("2018-08-07 00:00:00"));
        plot.setDomainAxis(dateAxis);

        plot.setRangeAxis(rangeAxis);
        try {
            ChartUtilities.saveChartAsJPEG(new File("chart.jpg"), chart, 500, 300);
        } catch (IOException e) {
            System.err.println("Problem occurred creating chart.");
        }
    }

    public static TimePeriodValues getNewSeries(String time1, String time2, int val) throws ParseException {

        TimePeriodValues series = new TimePeriodValues("Daily Holding Time");
        java.util.Date date = null;
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.ENGLISH);

        date = formatter.parse(time1);
        series.add(new Day(date), val);
        date = formatter.parse(time2);
        series.add(new Day(date), val);

        return series;
    }
}
...