NumberFormatOverride does not work well

A discussion forum for JFreeChart (a 2D chart library for the Java platform).

NumberFormatOverride does not work well

Postby RémiONERA » Tue Oct 03, 2017 2:09 pm

Hello

I have a XY plot chart with Y values between 1e-20 and 1e-12. I use a logarithmic scale and I want my ticks label to be shown in a scientific format (ie 1e-14)
So I did this
Code: Select all
NumberAxis Axis = (NumberAxis) l_Plot.getRangeAxis();
DecimalFormat formatter=new DecimalFormat("##0.##E0",new DecimalFormatSymbols(new Locale("us")));
Axis.setNumberFormatOverride(formatter);


Unfortunatly the result is a scale with numbers not formatted. I get 0.0000000000001 instead of 1e-12

The fun is that it works for values over 1

Any ideas
Rémi
RémiONERA
 
Posts: 5
Joined: Wed Jul 24, 2013 7:07 am

Re: NumberFormatOverride does not work well

Postby david.gilbert » Tue Oct 03, 2017 4:55 pm

Did you look at replacing the NumberAxis in your plot with an instance of LogAxis?
David Gilbert
JFreeChart Project Leader

:idea: Read my blog
:idea: Ask your company to buy the JFreeChart Developer Guide
:idea: Check out other products sold by my company Object Refinery Limited
david.gilbert
JFreeChart Project Leader
 
Posts: 11653
Joined: Fri Mar 14, 2003 10:29 am

Re: NumberFormatOverride does not work well

Postby RémiONERA » Wed Oct 04, 2017 7:14 am

My axis is already a LogAxis. I have replace
Code: Select all
NumberAxis Axis = (NumberAxis) l_Plot.getRangeAxis();

by
Code: Select all
LogarithmicAxis Axis = (LogarithmicAxis) l_Plot.getRangeAxis();

It still does not work
Rémi
RémiONERA
 
Posts: 5
Joined: Wed Jul 24, 2013 7:07 am

Re: NumberFormatOverride does not work well

Postby John Matthews » Thu Oct 05, 2017 1:31 am

I can't reproduce your result using LogAxis, suggested by David Gilbert above. As shown in the examples examined here, the LogTest below will let you experiment with various formats.

  1. Your DecimalFormat seems to work using setNumberFormatOverride().
  2. The LogFormat shown lets the axis display a scaled exponent, rather than a scaled mantissa.
  3. The default format, sans override, uses an AttributedString for superscripting.

Code: Select all
import java.awt.EventQueue;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.LogAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.util.LogFormat;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
* @see https://stackoverflow.com/q/10347674/230513
*/
public class LogTest {

    private void display() {
        XYSeries series = new XYSeries("");
        for (int i = 1; i < 10; i++) {
            series.add(i, Math.pow(10, i));
        }
        LogAxis yAxis = new LogAxis("Range");
        //yAxis.setNumberFormatOverride(new DecimalFormat("##0.##E0"));
        //yAxis.setNumberFormatOverride(new LogFormat(10, "10", "E", true));
        XYPlot plot = new XYPlot(new XYSeriesCollection(series),
            new NumberAxis("Domain"), yAxis, new XYLineAndShapeRenderer(true, false));
        JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new ChartPanel(chart));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new LogTest()::display);
    }
}
John Matthews
 
Posts: 388
Joined: Wed Sep 12, 2007 3:18 pm

NumberFormatOverride does not work well

Postby RémiONERA » Thu Oct 05, 2017 8:37 am

Your code is working but it does not respond to my problem. If I use my data instead of your formula I have label with decimal exponent (10-20.5) witch is not acceptable.
For exemple
Code: Select all
DecimalFormat df=new DecimalFormat("##0.##E0",new DecimalFormatSymbols(new Locale("us")));
LogFormat lf=new LogFormat(10, "10", "E", true);
System.out.println(d.format(53e-15));
System.out.println(lf.format(53e-15));

The result is
53E-15
10E-13,28
The first one is ok but the second one is not understandable for the people who will look at the values even if 53e-15=10e-13.28

The thing I don't understand is why when my exponent is negative the label is shown like that 0.00000000001 is there a problem with AttributedString?
Rémi
RémiONERA
 
Posts: 5
Joined: Wed Jul 24, 2013 7:07 am

Re: NumberFormatOverride does not work well

Postby John Matthews » Thu Oct 05, 2017 10:53 am

RémiONERA wrote:Is there a problem with AttributedString?


Not to my knowledge. As shown in the createTickLabel() source code, TextAttribute.SUPERSCRIPT is applied when you don't specify a format override. If you do specify a format override, LogFormat scales the exponent, while DecimalFormat scales the mantissa, as your result shows.
John Matthews
 
Posts: 388
Joined: Wed Sep 12, 2007 3:18 pm

Re: NumberFormatOverride does not work well

Postby RémiONERA » Tue Oct 10, 2017 12:59 pm

In the LogarithmicAxis class I have found the setExpTickLabelsFlag(boolean flag) which solves my problem.
I have also tried setLog10TickLabelsFlag(boolean flag) doesn't work.
Rémi
RémiONERA
 
Posts: 5
Joined: Wed Jul 24, 2013 7:07 am


Return to JFreeChart

Who is online

Users browsing this forum: Bing [Bot], Yahoo [Bot] and 6 guests