Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
166 views
in Technique[技术] by (71.8m points)

java - How to perform big numbers on axis (for example, 10^3 format) in chart?

Using a big space performing long numbers is not a good decision. If I have a graph with a medium scale about 50 000, on the Y axis will be written "50 000, 60 000, 10 000". Can I perform it there like 50 * 10^3 or something else? It's necessary for charts with several scales like here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Use a tickLabelFormatter on the axis. For example:

    NumberFormat format = new DecimalFormat("#.#E0");
    yAxis.setTickLabelFormatter(new StringConverter<Number>() {

        @Override
        public String toString(Number number) {
            return format.format(number.doubleValue());
        }

        @Override
        public Number fromString(String string) {
            try {
                return format.parse(string);
            } catch (ParseException e) {
                e.printStackTrace();
                return 0 ;
            }
        }

    });

Complete example:

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class LineChartWithFormattedNumbers extends Application {

    @Override
    public void start(Stage primaryStage) {
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();

        NumberFormat format = new DecimalFormat("#.#E0");
        yAxis.setTickLabelFormatter(new StringConverter<Number>() {

            @Override
            public String toString(Number number) {
                return format.format(number.doubleValue());
            }

            @Override
            public Number fromString(String string) {
                try {
                    return format.parse(string);
                } catch (ParseException e) {
                    e.printStackTrace();
                    return 0 ;
                }
            }

        });

        xAxis.setLabel("Number of Month");
        //creating the chart
        final LineChart<Number,Number> lineChart = 
                new LineChart<Number,Number>(xAxis,yAxis);

        lineChart.setTitle("Stock Monitoring, 2010");
        //defining a series
        XYChart.Series<Number, Number> series = new XYChart.Series<>();
        series.setName("My portfolio");
        //populating the series with data
        series.getData().add(new XYChart.Data<>(1, 23e10));
        series.getData().add(new XYChart.Data<>(2, 14e9));
        series.getData().add(new XYChart.Data<>(3, 15e10));
        series.getData().add(new XYChart.Data<>(4, 24e9));
        series.getData().add(new XYChart.Data<>(5, 34e10));
        series.getData().add(new XYChart.Data<>(6, 36e10));
        series.getData().add(new XYChart.Data<>(7, 22e10));
        series.getData().add(new XYChart.Data<>(8, 45e10));
        series.getData().add(new XYChart.Data<>(9, 43e10));
        series.getData().add(new XYChart.Data<>(10, 17e10));
        series.getData().add(new XYChart.Data<>(11, 29e10));
        series.getData().add(new XYChart.Data<>(12, 25e10));

        Scene scene  = new Scene(lineChart,800,600);
        lineChart.getData().add(series);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...