Search code examples
jfreechart

Plotting time in milliseconds - JFreeChart (Step Chart)


I'm trying to plot a step chart with the following properties: x-axis: Time (ms) [Actual data contains this as a double value] y-axis: Another value stored as an integer.

I'm filling up the dataset as follows:

private XYSeries populateStepChartDataSet(HashMap<Double, Integer> dataGrid){
    XYSeries xySeries = new XYSeries("Step Plot", true, true);

    if(dataGrid != null){
        for (Double timeStamp : dataGrid.keySet()) {
            xySeries.add(timeStamp, dataGrid.get(timeStamp));
        }
    }

    return xySeries;
}

And the section where I create the plot is as follows:

        final XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(populateStepChartDataSet(dspDataGrid));

        final JFreeChart chart = ChartFactory.createXYStepChart(
            title,
            xAxisLabel, yAxisLabel,
            dataset,
            PlotOrientation.VERTICAL,
            true,   // legend
            true,   // tooltips
            false   // urls
        );

What I expect is the plot to show time in ms at the x-axis but this value is getting converted to some weird time. Here's how the plot looks enter image description here

Can someone please help me get back the timestamp in ms format for the x-axis?


Solution

  • It looks like the x Axis is formatting as a date one way of adressing this is to provide a NumberFormatOverride

    Add this code after your chart is created:

    XYPlot plot = (XYPlot)chart.getPlot();
    plot.setDomainAxis(0, new NumberAxis()); 
    NumberAxis axis = (NumberAxis) plot.getDomainAxis();
    axis.setNumberFormatOverride( new NumberFormat(){
    
        @Override
        public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
    
        return new StringBuffer(String.format("%f", number));
        }
    
        @Override
        public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
        return new StringBuffer(String.format("%9.0f", number));
        }
    
        @Override
        public Number parse(String source, ParsePosition parsePosition) {
        return null;
        }
        } );
        axis.setAutoRange(true);
        axis.setAutoRangeIncludesZero(false);
    

    You shold then get this chart:

    Chart