JFreeChart с датой в виде x меток

Я реализую приложение, которое извлекает данные CSV из информационной сети COVID-19.

Я сделал синтаксический анализатор, который получает случаи в день из определенного места (Канарские острова).

String url = "https://cnecovid.isciii.es/covid19/resources/datos_ccaas.csv";
String[] contents = HTTPFileDownloader.downloadFromURL(url).split("\n");

for(String i : contents) {
    if (isCanaryIslandData(i)) {
        String[] line = i.split(",");
        String[] date = line[1].split("-");    // "YYYY-MM-DD"

        int cases = Integer.parseInt(line[2]);

        casesPerDay.add(cases);
     }
 }

Теперь я хочу сделать диаграмму, отображающую данные. Что-то вроде этого:

В настоящее время я сохраняю значения в ArrayList (только для тестирования). Я знаю, что мне нужно будет сохранить дату и количество случаев, но я не знаю, какой тип набора данных мне следует использовать.

Я хочу сделать линию и гистограмму. Мне удалось это сделать:

Но, как я уже сказал, я хочу найти способ отображать даты в виде меток x, как показано в примере.

Я пробовал с CategoryDataset, но он печатает каждую метку x, поэтому его вообще нельзя будет прочитать. Я знаю, что XYSeries может сделать трюк, как показано ранее, но я не знаю, как вставить строку в качестве метки вместо целого числа.

Надеюсь, я объяснил это хорошо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось сделать это с помощью TimeSeriesCollection

TimeSeries series = new TimeSeries("Cases per Day");
String url = "https://cnecovid.isciii.es/covid19/resources/datos_ccaas.csv";
String[] contents = HTTPFileDownloader.downloadFromURL(url).split("\n");

    for(String i : contents) {
        if (isCanaryIslandData(i)) {
            String[] line = i.split(",");
            String[] date = line[1].split("-");

            int year = Integer.parseInt(date[0]);
            int month = Integer.parseInt(date[1]);
            int day = Integer.parseInt(date[2]);

            int cases = Integer.parseInt(line[2]);

            series.add(new Day(day, month, year), cases);

        }
    }

Затем в классе диаграммы:

    TimeSeriesCollection dataset = new TimeSeriesCollection();

    dataset.addSeries(series);

    JFreeChart chart = ChartFactory.createXYLineChart(
               "Line Chart",
               "x",
               "y",
               dataset,
               PlotOrientation.VERTICAL,
               true,
               true,
               false);

   ChartPanel chartPanel = new ChartPanel(chart);
   chartPanel.setMouseWheelEnabled(true);
   chartPanel.setPreferredSize(new java.awt.Dimension(560,367));

   XYPlot plot = (XYPlot) chart.getPlot();
   DateAxis dateAxis = new DateAxis();
   dateAxis.setDateFormatOverride(new SimpleDateFormat("dd-MM-yyyy"));
   plot.setDomainAxis(dateAxis);

И вывод:

Я не знаю, лучшее ли это решение, но оно работает.

Также учтите java.time, видели здесь.

trashgod 23.12.2020 19:33

Другие вопросы по теме