Search code examples
javaswingjframejfreechart

How to set the JFreeChart X axis data titles?


Attached my code snippet here, I am using XYStepChart from chart factory. The x-axis scale at output for the code is being displayed in scale of eg: 05:30:00:00, 05:30:00:01, 05:30:00:00. But I need in values like 1,2,3,4.

package org.jfree.chart.demo;

import java.awt.BasicStroke;
import java.awt.Color;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.RefineryUtilities;
public class XYStepChartDemo 
{
private ChartFrame frame = null;
private void displayChart() {
    if (this.frame == null) {
        final String title = "Trace";
        final String xAxisLabel = "Tasks";
        final String yAxisLabel = "Amplitude";
        final XYDataset data = createStepXYDataset();
        final JFreeChart chart = ChartFactory.createXYStepChart(
            title,
            xAxisLabel, yAxisLabel,
            data,
            PlotOrientation.VERTICAL,
            true,   // legend
            true,   // tooltips
            false   // urls
        );
        chart.setBackgroundPaint(new Color(216, 216, 216));
        final XYPlot plot = chart.getXYPlot();
        plot.getRenderer().setSeriesStroke(0, new BasicStroke(2.0f));
        plot.getRenderer().setSeriesStroke(1, new BasicStroke(2.0f));
        this.frame = new ChartFrame("Plan Comparison", chart);
        this.frame.pack();
        RefineryUtilities.positionFrameRandomly(this.frame);
        this.frame.setVisible(true);
    }
    else {
        this.frame.setVisible(true);
        this.frame.requestFocus();
    }
   }

 public static XYDataset createStepXYDataset() {
 final XYSeries series1 = new XYSeries("Series 2");
 series1.add(0, 5);
 series1.add(1, 0);
 series1.add(2, 0);
 series1.add(3, 0);
 series1.add(4, 0);
 series1.add(5, 5);
 series1.add(6, 0);
 series1.add(7, 0);
 series1.add(8, 0);
 final XYSeriesCollection dataset = new XYSeriesCollection();
 dataset.addSeries(series1);
 return dataset;
  }
  public static void main(final String[] args) {
    final XYStepChartDemo demo = new XYStepChartDemo();
    demo.displayChart();

   }

   }

Output looks like x-axis in some time format, i need only in values like 1, 2, 3, 4 etc to be displayed


Solution

  • ChartFactory.createXYStepChart uses a DateAxis for the domain, so your XYSeries ordinates are interpreted as seconds since the Java epoch. You can either,

    • Use setDateFormatOverride() to format the values as shown here.

    • Use setDomainAxis() on the XYPlot to substitute a NumberAxis for the domain, also suggested here; use integer tick units, as suggested here.

      NumberAxis domain = new NumberAxis(xAxisLabel);
      domain.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
      plot.setDomainAxis(domain);
      

    image