javajasper-reportsjfreechartdynamic-reports

How to set logarithmic scale for domain and range axis in XYLineChart


Is there any way to set logarithmic scale for x axis and y axis.

I have added code below for reference which I used to create chart.

XyLineChartBuilder lineBuilder = DynamicReports.cht.xyLineChart()
    .setTitle(reportSection.getGraphName())
    .setTitleFont(boldFont)
    .setXValue(xColumn)
    .series(yAxisLineSeries)
    .setXAxisFormat(DynamicReports.cht.axisFormat()
    .setLabel(reportSection.getxAxisCaption()))
    .setYAxisFormat(DynamicReports.cht.axisFormat()
    .setLabel(reportSection.getyAxisCaption()))
    .setDataSource(createDataSource(reportSection, noOfYaxis));

Solution

  • I tried with base 10 and base 2, but both didn't plot negative values.

    LogarithmicAxis provides a setAllowNegativesFlag() method, which may be set "true to allow negative values in data," or "false to be able to plot positive values arbitrarily close to zero." I've adapted this example to illustrate the effect.

    log axis

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.LogarithmicAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
    
    /**
     * @See https://stackoverflow.com/a/53912014/230513
     * @see https://stackoverflow.com/a/22450677/230513
     * @see https://stackoverflow.com/a/10353270/230513
     */
    public class Test {
    
        private static final int N = 10;
    
        private void display() {
            XYSeries series = new XYSeries("Series");
            for (int i = -N; i <= N; i++) {
                series.add(i, i);
            }
            LogarithmicAxis xAxis = new LogarithmicAxis("X");
            xAxis.setAllowNegativesFlag(true);
            LogarithmicAxis yAxis = new LogarithmicAxis("Y");
            yAxis.setAllowNegativesFlag(true);
            XYPlot plot = new XYPlot(new XYSeriesCollection(series),
                xAxis, yAxis, new XYLineAndShapeRenderer(true, false));
            JFreeChart chart = new JFreeChart(
                "Chart", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
    
            JFrame f = new JFrame("Test");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new ChartPanel(chart) {
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(700, 400);
                }
            });
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new Test().display();
                }
            });
        }
    }