2

(-、+)Y軸にデータがスタックされたグラフがあります。

  • JfreeChartを使用すると、これらすべてが厳密になり、データが失われることなく各バーに完全に表示されます。ここに画像の説明を入力してください

  • ただし、javafx StackedBarチャートを使用する場合、棒グラフに(正と負の)データがスタックされていると、棒が破損し、データが失われます。 ここに画像の説明を入力してください

                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));
                }
    

アップデート :

-OracleStackedBarChartサンプル- 「シリーズ値を変更します」

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);
}

}

  • マイナス値なし。 マイナス値なし
  • マイナス値のデータが破損しています。 マイナス値のデータが破損している
4

2 に答える 2

1

StackedBarChartコードにバグが見つかりました:

    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であり、マップが以前のバーデータをクリアするため、そのバーがマップに入力される最後の値になります。

    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

  • そのため、コードの行はになります。

    private Map<Series, Map<String, List<Data<X, Y>>>> seriesCategoryMap = new HashMap<Series, Map<String, List<Data<X, Y>>>>();
    
  • その後、そのデータ構造に応じてコードを更新する必要があります。

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は、負の値と正の値の軸でバーの長さを管理する2つのメソッドを更新します。

于 2013-03-18T20:17:39.997 に答える
-1

使用する...

http://download.oracle.com/otndocs/products/javafx/2.2/samples/Ensemble/index.html

また

JavaFXシーンビルダー1.1

ここに画像の説明を入力してください

于 2013-03-15T11:49:30.787 に答える