Javier Alonso Delgado
Javier Alonso Delgado

Reputation: 321

JFreeChart with date as x labels

I am implementing an application which retrieves CSV data from COVID-19 info web.

I have made a parser which gets the cases per day of an specific place (Canary Island).

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);
     }
 }

Now I want to make a chart displaying the data. Something like this:

Desired Output

Currently I am storing the values in an ArrayList (just for testing). I know I will need to store the date and the number of cases, but I don't know which type of dataset should I use.

I want to make a line and a bar chart. I have managed to do it:

enter image description here

But as I have said, I want to find a way to display the dates as the x labels as shown in the example.

I tried with a CategoryDataset, but that prints every single x label so it won't be readable at all. I know XYSeries can do the trick as shown before, but I don't know how to insert a string as label instead of an integer.

Hope I explained it well.

Upvotes: 3

Views: 456

Answers (1)

Javier Alonso Delgado
Javier Alonso Delgado

Reputation: 321

I managed to do it using 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);

        }
    }

Then on the chart class:

    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);

And output:

enter image description here

I don't know if it's the best solution, but it does the work.

Upvotes: 2

Related Questions