Ihor
Ihor

Reputation: 39

JavaFX BarChart - minimum value for Y Axis

I have data which changes from 750 000 - 1 000 000+- so I actually dont need to see value under 750 000.

If I just making y[i] - 750 000 so there's another problem (shows on AxisY min 0 and to 250 000+-)

How can i make this with BarChart?

BarChart<String,Number> bc= new BarChart<String, Number>(xAxis,yAxis);//statistic-years
bc.setTitle("Statistic-Years");
xAxis.setLabel("Country");
yAxis.setLabel("Value");
int[] cityPopulation = {
    857200, 866500,871100,880400,889600,891900, 889800, 882100, 873200, 864400, 854300, 844300, 831500, 818910,
    816382, 814255,813159,811939,812990,812862, 812605, 814224, 814070, 815786, 816061, 815269, 814758, 813387};
int[] countryPopulation = {
        1075400,1059100,1043300,1028000,1022300,1012900,999900,993100,987300,980200,974400,966700,959500,953461,937490,
        921981, 906978, 889632, 873477, 859355, 847370, 836384,827131,818401,810977,802993,795815,788776,
};
XYChart.Series series1 = new XYChart.Series();
series1.setName("Country population");
XYChart.Series series2 = new XYChart.Series();
series2.setName("City population");
bc.setStyle("-fx-font-size: 14;-fx-font-weight: bolder;");
bc.setStyle("CHART_COLOR_1: rgb(2,0,94); " + "CHART_COLOR_2: rgb(189,0,18); ");
for (int i =0;i<cityPopulation.length;i++) {
    series1.getData().add(new XYChart.Data(""+(i+1989),countryPopulation[i]));
    series2.getData().add(new XYChart.Data(""+(i+1989),cityPopulation[i]));
}
bc.getData().add(series1);
bc.getData().add(series2);

Upvotes: 1

Views: 2846

Answers (1)

DVarga
DVarga

Reputation: 21799

The axis has these boundaries because the default value of the autoRangingProperty is true and the default value of the forceZeroInRangeProperty is also true.

This means, that the axis will set its own boundaries automatically, while keeping the zero value always displayed, therefore the lower bound will be at least zero.

You can set the forceZeroInRangeProperty to false which will lead to have automatic ranging, but as the zero value is not forced to be displayed, the boundaries will be calculated based on the minimum and maximum value on the data displayed.

yAxis.setForceZeroInRange(false);

Alternatively you can manually set the axis boundaries with:

Either using for example the appropiate constructor to set the lower and upper bound:

NumberAxis yAxis = new NumberAxis(700000, 1200000, 1000);

or by setting the autoRangingProperty to false and the lowerBoundProperty and the upperBoundProperty to the needed values:

NumberAxis yAxis = new NumberAxis();
yAxis.setAutoRanging(false);
yAxis.setLowerBound(700000);
yAxis.setUpperBound(1200000);

Example chart by setting forceZeroInRangeProperty to false:

enter image description here

Upvotes: 3

Related Questions