JavaFx StackedBarChart问题 [英] JavaFx StackedBar Chart Issue
问题描述
我有一个图表,数据堆积在(-,+)Y轴上.
I have a chart with data stacked on (-,+)Y-Axis.
-
使用JfreeChart,这一切都是正确的,数据完美地显示在每个条形上而不会丢失.
With JfreeChart all this go rigth and data appear perfectly on each bar without loss.
但是,当使用javafx StackedBar Chart时,当柱系列具有(正和负)数据堆叠的柱损坏且丢失数据时.
But when using javafx StackedBar Chart , when bar series have (positive & negative) data stacked bar corrupted and loss data.
if (plusValue > 0) {
series.getData().add(new XYChart.Data<String, Number>(xPoint, plusValue));
}
if (minusValue > 0) {
series.getData().add(new XYChart.Data<String, Number>(xPoint, -minusValue));
}
更新:
- Oracle StackedBarChart示例 -我更改系列值"
-Oracle StackedBarChart Sample - "I change Series value"
import java.util.Arrays;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.StackedBarChart;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class StackedBarChartSample extends Application {
final static String austria = "Austria";
final static String brazil = "Brazil";
final static String france = "France";
final static String italy = "Italy";
final static String usa = "USA";
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
final StackedBarChart<String, Number> sbc =
new StackedBarChart<String, Number>(xAxis, yAxis);
final XYChart.Series<String, Number> series1 =
new XYChart.Series<String, Number>();
final XYChart.Series<String, Number> series2 =
new XYChart.Series<String, Number>();
final XYChart.Series<String, Number> series3 =
new XYChart.Series<String, Number>();
@Override
public void start(Stage stage) {
stage.setTitle("Bar Chart Sample");
sbc.setTitle("Country Summary");
xAxis.setLabel("Country");
xAxis.setCategories(FXCollections.<String>observableArrayList(
Arrays.asList(austria, brazil, france, italy, usa)));
yAxis.setLabel("Value");
series1.setName("2003");
// plus value
series1.getData().add(new XYChart.Data<String, Number>(austria, 200));
series1.getData().add(new XYChart.Data<String, Number>(brazil, 300));
series1.getData().add(new XYChart.Data<String, Number>(france, 400));
series1.getData().add(new XYChart.Data<String, Number>(italy, 500));
series1.getData().add(new XYChart.Data<String, Number>(usa, 600));
// minus value
series1.getData().add(new XYChart.Data<String, Number>(austria, -200));
series1.getData().add(new XYChart.Data<String, Number>(brazil, -300));
series1.getData().add(new XYChart.Data<String, Number>(france, -400));
series1.getData().add(new XYChart.Data<String, Number>(italy, -500));
series1.getData().add(new XYChart.Data<String, Number>(usa, -600));
series2.setName("2004");
series2.getData().add(new XYChart.Data<String, Number>(austria, 200));
series2.getData().add(new XYChart.Data<String, Number>(brazil, 300));
series2.getData().add(new XYChart.Data<String, Number>(france, 400));
series2.getData().add(new XYChart.Data<String, Number>(italy, 500));
series2.getData().add(new XYChart.Data<String, Number>(usa, 600));
// minus value
series2.getData().add(new XYChart.Data<String, Number>(austria, -200));
series2.getData().add(new XYChart.Data<String, Number>(brazil, -300));
series2.getData().add(new XYChart.Data<String, Number>(france, -400));
series2.getData().add(new XYChart.Data<String, Number>(italy, -500));
series2.getData().add(new XYChart.Data<String, Number>(usa, -600));
series3.setName("2005");
series3.getData().add(new XYChart.Data<String, Number>(austria, 200));
series3.getData().add(new XYChart.Data<String, Number>(brazil, 300));
series3.getData().add(new XYChart.Data<String, Number>(france, 400));
series3.getData().add(new XYChart.Data<String, Number>(italy, 500));
series3.getData().add(new XYChart.Data<String, Number>(usa, 600));
// minus value
series3.getData().add(new XYChart.Data<String, Number>(austria, -200));
series3.getData().add(new XYChart.Data<String, Number>(brazil, -300));
series3.getData().add(new XYChart.Data<String, Number>(france, -400));
series3.getData().add(new XYChart.Data<String, Number>(italy, -500));
series3.getData().add(new XYChart.Data<String, Number>(usa, -600));
Scene scene = new Scene(sbc, 800, 600);
sbc.getData().addAll(series1, series2, series3);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
- 没有负值.
- 负值数据已损坏.
- Without minus value.
- With minus value data corrupted.
推荐答案
我在StackedBarChart代码上发现了该错误:
I found the bug on the StackedBarChart code:
private Map<Series, Map<String,Data<X, Y>>> seriesCategoryMap = new HashMap<Series, Map<String, Data<X, Y>>>();
-
该行代码表示每个系列都有
map<String categoryPoint ,data bar>
,因此该系列只有one bar for that categoryPoint
,并且该条形图是将被放置到地图中的最后一个值,因为地图将清除先前的条形图数据.That Line of code mean that each series has
map<String categoryPoint ,data bar>
,so that series has onlyone bar for that categoryPoint
, and that bar will be the last value putted into map as map will clear previous bar data.categoryMap.put(categoryPoint,bar);
-
但是我们需要seriesCategoryMap中的每个系列都具有categoryMap,但是该地图必须具有
for each categoryPoint to be List<Data>
.结论,对于每个系列,我们都有categoryMap,对于该categoryMap中的每个categoryPoint,我们都有
List<Data<X,Y>> bar List to have positive and negative bars
.Conclusions, for each series we have categoryMap and for each categoryPoint in that categoryMap we have
List<Data<X,Y>> bar List to have positive and negative bars
.这样一行代码就变成了.
So that line of code become.
private Map<Series, Map<String, List<Data<X, Y>>>> seriesCategoryMap = new HashMap<Series, Map<String, List<Data<X, Y>>>>();
-
此后,我们必须根据该数据结构来更新代码.
After that we have to update the code depend on that data Structure.
1-更新'dataItemAdded& seriesAdded'方法.
// list to hold more that one bar "positive and negative" List<Data<X, Y>> itemList = categoryMap.get(category) != null ? categoryMap.get(category) : new ArrayList<Data<X, Y>>(); itemList.add(item); categoryMap.put(category, itemList);
2-getDataItem方法.
private List<Data<X, Y>> getDataItem(Series<X, Y> series, int seriesIndex, int itemIndex, String category) { Map<String, List<Data<X, Y>>> catmap = seriesCategoryMap.get(series); return catmap != null ? catmap.get(category) != null ? catmap.get(category) : new ArrayList<Data<X, Y>>() : new ArrayList<Data<X, Y>>(); }
3-updateAxisRange& layoutPlotChildren更新了这两种方法来管理负值和正值轴上的钢筋长度.
带有正负条的Oracle StackedBarChart示例
StackedBarChart完美显示栏,没有任何数据损坏
这篇关于JavaFx StackedBarChart问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!