Я реализую приложение, которое извлекает данные 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 может сделать трюк, как показано ранее, но я не знаю, как вставить строку в качестве метки вместо целого числа.
Надеюсь, я объяснил это хорошо.




Мне удалось сделать это с помощью 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, видели здесь.