即使在轴上进行自动量程,我可以保留整数刻度线吗?

时间:2015-02-08 17:23:25

标签: java charts javafx javafx-8

我从here“窃取”了一些代码,使AreaChart具有“流畅的线条”,我在我的FXML中使用它并且有效:

    <SmoothedAreaChart fx:id="chart" legendVisible="false"
        title="Tree depth by line" animated="false">
        <xAxis>
            <NumberAxis fx:id="xAxis" tickUnit="1.0" autoRanging="false"
                minorTickVisible="false" forceZeroInRange="false"
                label="Line number"/>
        </xAxis>
        <yAxis>
            <NumberAxis fx:id="yAxis" minorTickVisible="false"
                tickUnit="1.0" forceZeroInRange="true" label="Tree depth"/>
        </yAxis>
    </SmoothedAreaChart>

然而我遇到的问题是Y轴。

我将tickUnit设置为1.0,因为我想要的是整数单位,但它不太有效:

enter image description here

如果在yAxis的定义中,我将autoRanging设置为false,则会裁剪图表(我在填充图表时手动设置上限):

enter image description here

而且,也有太多刻度线。

基本上,我想要两者的行为:

  • 自动量程发生,
  • 但刻度线始终是整数。

是否有可能这样做,或者我是否需要编写自己的代码/找到Axis的实现呢?

2 个答案:

答案 0 :(得分:1)

好吧,好吧,我找到了一个解决方案。

我不再在FXML中指定刻度单位;相反,我在代码中执行此操作,我也设置了y轴的最大值(并且autoranging设置为false):

display.yAxis.setUpperBound(maxDepth);
final int tickUnit = maxDepth / 15;
display.yAxis.setTickUnit(Math.max(tickUnit, 1));
当然,那是一种黑客行为,我当然希望它能在API中开始。或许它是,我没有看到它......

答案 1 :(得分:0)

在这里,您可以看到几行来格式化您想要的数字。 (所以太多人要求解释)

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.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class AxisFormatter extends Application {
    final NumberAxis xAxis = new NumberAxis();
    final NumberAxis yAxis = new NumberAxis();
    final LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
    double i = 0d;

    final StringConverter<Number> converter =  new StringConverter<Number>() {
        @Override public String toString(Number object) {
            //just an untested idea for isInteger
            return object.doubleValue() == object.intValue() 
                    ? object.intValue()+""
                    :"";
        }
        @Override public Number fromString(String string) { return 0;}
    };

    @Override public void start(Stage primaryStage) {

        chart.getData().add(new XYChart.Series<>());

        while (i++ < 10d)
            chart.getData().get(0).getData().add(new XYChart.Data<>(i,i/2));

        Button btn1 = new Button("increase max y value");
        btn1.setOnAction((evt)->{
            chart.getData().get(0).getData().add(new XYChart.Data<>(i++,i/2));
        });

        Button btn2 = new Button("change formatter");
        btn2.setOnAction((evt)->{
            yAxis.setTickLabelFormatter(yAxis.getTickLabelFormatter() == converter
                ? null : converter);
        });

        yAxis.setTickLabelFormatter(converter);

        VBox root = new VBox(chart, new HBox(5,btn1,btn2));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}