【问题标题】:JFreeChart with date as x labels日期为 x 标签的 JFreeChart
【发布时间】:2020-12-23 13:34:46
【问题描述】:

我正在实现一个从 COVID-19 info web 检索 CSV 数据的应用程序。

我制作了一个解析器,它每天获取特定地点(加那利岛)的案例。

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 可以做到如前所示的技巧,但我不知道如何插入字符串作为标签而不是整数。

希望我解释清楚。

【问题讨论】:

    标签: java charts jfreechart


    【解决方案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,见here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多