Как установить исходную базовую линию диаграммы? - PullRequest
0 голосов
/ 28 декабря 2018

Я бы использовал JavaFX для рисования столбцов, представляющих силу звука.Диапазон моих значений от -60 до +3 дББФ (полная шкала децибел).

Когда JavaFX рисует «бары», базовая линия всегда устанавливается на 0, поэтому мои бары рисуются от 0 до +X (выше нулевой линии) или от 0 до -X (ниже нулевой линии).

Моя цель - получить бар от -60 до -X.Есть ли способ установить исходную точку -60?Я искал советы в Google и попробовал несколько вещей, но ничего не помогло.

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 28 декабря 2018

Я не знаю, как изменить базовую линию диаграммы JavaFX.Тем не менее, вы можете сделать так, чтобы выглядел , как будто оно начинается с -60.Класс ValueAxis (и, соответственно, NumberAxis) имеет свойство для форматирования меток: tickLabelFormatter.Вы можете указать свой собственный StringFormatter, который делает ярлыки «выключенными на 60».Вот пример:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class App extends Application {

  @Override
  public void start(Stage primaryStage) throws Exception {
    var scene = new Scene(createChart() 600, 400);
    primaryStage.setScene(scene);
    primaryStage.setTitle("SO-53959031");
    primaryStage.show();
  }

  @SuppressWarnings("unchecked")
  private Series<String, Number> createData() {
    return new Series<>(FXCollections.observableArrayList(
        new Data<>("Test #0", 40),
        new Data<>("Test #1", 20),
        new Data<>("Test #2", 63),
        new Data<>("Test #3", 50),
        new Data<>("Test #4", 30)
    ));
  }

  private BarChart<String, Number> createChart() {
    var yAxis = new NumberAxis("dbBF", 0, 63, 1);
    yAxis.setTickLabelFormatter(new StringConverter<>() {
      @Override
      public String toString(Number object) {
        return Double.toString(object.doubleValue() - 60);
      }

      @Override
      public Number fromString(String string) {
        return Double.valueOf(string) + 60;
      }
    });

    var chart = new BarChart<>(new CategoryAxis(), yAxis);
    chart.getData().add(createData());
    chart.setLegendVisible(false);
    return chart;
  }

}

Есть одно предупреждение: вы должны перевести свои данные, чтобы они начинались с нуля.Это нужно сделать только для данных диаграммы.Другими словами, ваша модель может хранить данные между -60 и 3, но их необходимо перевести в диапазон от 0 до 63 для диаграммы.


Пример экрана:

screenshot of chart

...