Logarithmic Axis Labels/Ticks Customization

后端 未结 3 437
忘了有多久
忘了有多久 2020-11-29 11:13

I am using the JFreeChart API to generate some chart in my Java application. In one of my charts, I try to use the LogAxis object to make my y-axis

相关标签:
3条回答
  • 2020-11-29 12:06

    IMHO, you should use the ChartFactory to create the type of chart you want, and not create the JFreeChart constructor directly. Therefore, this is a better solution than what has been previously posted:

    public class MyLogChart 
    {
        public static void main(String[] args) 
        {
            XYSeries series = new XYSeries("First");
            series.add(1.0, 1.0);
            series.add(2.0, 10.0);
            series.add(3.0, 100.0);
            series.add(4.0, 1000.0);
            series.add(5.0, 10000.0);
            series.add(6.0, 100000.0);
            series.add(7.0, 1000000.0);
            series.add(8.0, 10000000.0);
    
            XYSeriesCollection dataset = new XYSeriesCollection();
            dataset.addSeries(series);
    
            JFreeChart chart = ChartFactory.createXYLineChart(
                "XY Chart",
                "x-axis",
                "y-axis",
                dataset,
                PlotOrientation.VERTICAL,
                false,
                false,
                false
                );
    
            LogarithmicAxis yAxis = new LogarithmicAxis("Y");
    
            XYPlot plot = chart.getXYPlot();
            plot.setRangeAxis(yAxis);
    
            XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer)plot.getRenderer();
            renderer.setSeriesShapesVisible(0, true);
    
            ChartFrame frame = new ChartFrame("My Chart", chart);
            frame.pack();
            frame.setVisible(true);
        }
    }
    
    0 讨论(0)
  • 2020-11-29 12:08

    I think what you need is logAxis.setNumberFormatOverride(NumberFormat format);

    EDIT: Since further help is needed... try this:

    logAxis.setBase(10);
    LogFormat format = new LogFormat(logAxis.getBase(), "", "", true);
    logAxis.setNumberFormatOverride(format);
    

    Here's a whole method that can be used to play with...:

      public static void main(String[] args) {
        XYSeries series = new XYSeries("");
        series.add(1, 10);
        series.add(2, 100);
        series.add(3, 1000);
        series.add(4, 10000);
        series.add(5, 100000);
        series.add(6, 1000000);
    
    //    NumberAxis yAxis = new NumberAxis("");
        LogAxis yAxis = new LogAxis("");
        yAxis.setBase(10);
        LogFormat format = new LogFormat(yAxis.getBase(), "", "", true);
        yAxis.setNumberFormatOverride(format);
        XYPlot plot = new XYPlot(
          new XYSeriesCollection(series),
          new NumberAxis(""),
          yAxis,
          new XYLineAndShapeRenderer(true, false));
        JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
    
        JFrame frame = new JFrame("LogAxis Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new ChartPanel(chart));
        frame.pack();
        frame.setVisible(true);
      }
    
    0 讨论(0)
  • 2020-11-29 12:18

    Even though you're using a LogAxis, you can specify integer tick units, as shown in the variation of @amaidment's example below.

    LogAxis

    /** @see http://stackoverflow.com/a/10353270/230513 */
    private static void createFrame() {
        XYSeries series = new XYSeries("Series");
        for (int i = 0; i <= N; i++) {
            series.add(i, Math.pow(2, i));
        }
        NumberAxis xAxis = new NumberAxis("X");
        xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        LogAxis yAxis = new LogAxis("Y");
        yAxis.setBase(2);
        yAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        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 frame = new JFrame("LogAxis Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new ChartPanel(chart));
        frame.pack();
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
    
            @Override
            public void run() {
                createFrame();
            }
        });
    }
    
    0 讨论(0)
提交回复
热议问题