JavaFX 中的双面条形图
Double sided bar chart in JavaFX
对于我正在进行的项目,我想在 JavaFX 中将数据显示为不断更新的双面条形图(或双面直方图)。我已经成功创建了一个水平条形图,其中条形图仅从轴的一侧延伸,而不是从两侧延伸。
我想做的一个例子是,在图表上,每一行(或条形)代表一家商店,左侧代表当前女性的百分比,右侧代表当前男性的百分比。当顾客进出商店时,此图表会更新以显示当前的性别百分比,除非没有顾客,否则总加起来为 100%。在这种情况下没有酒吧。这意味着,除非没有顾客,否则酒吧的长度将始终相同,只是向两侧移动。整个图表可能显示 5 家不同的商店,因此有五个不同的性别代表条。
我没有足够的声誉来 post 图片所以这是 link 我想要的样子。
这是一个 link 看起来像我目前可以制作的东西。
谢谢!
最初我尝试使用 BarChart 对象来绘制双面条形图,但在查看 this question 之后我意识到 StackedBarChart 具有我正在寻找的东西。这是我用来为想知道如何执行此操作的其他人创建双面 histogram/bar 图表的代码:
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 HorizontalHistogramTest 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<Number, String> sbc =
new StackedBarChart<Number,String>(yAxis, xAxis);
final XYChart.Series<Number,String> series1 =
new XYChart.Series<Number,String>();
@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("Percent");
// plus value
series1.getData().add(new XYChart.Data<Number,String>(10, austria));
series1.getData().add(new XYChart.Data<Number,String>(50, brazil));
series1.getData().add(new XYChart.Data<Number,String>(40, france));
series1.getData().add(new XYChart.Data<Number,String>(50, italy));
series1.getData().add(new XYChart.Data<Number,String>(60, usa));
// minus value
series1.getData().add(new XYChart.Data<Number,String>(-90, austria));
series1.getData().add(new XYChart.Data<Number,String>(-50, brazil));
series1.getData().add(new XYChart.Data<Number,String>(-60, france));
series1.getData().add(new XYChart.Data<Number,String>(-50, italy));
series1.getData().add(new XYChart.Data<Number,String>(-40, usa));
Scene scene = new Scene(sbc, 800, 600);
sbc.getData().addAll(series1);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
对于我正在进行的项目,我想在 JavaFX 中将数据显示为不断更新的双面条形图(或双面直方图)。我已经成功创建了一个水平条形图,其中条形图仅从轴的一侧延伸,而不是从两侧延伸。
我想做的一个例子是,在图表上,每一行(或条形)代表一家商店,左侧代表当前女性的百分比,右侧代表当前男性的百分比。当顾客进出商店时,此图表会更新以显示当前的性别百分比,除非没有顾客,否则总加起来为 100%。在这种情况下没有酒吧。这意味着,除非没有顾客,否则酒吧的长度将始终相同,只是向两侧移动。整个图表可能显示 5 家不同的商店,因此有五个不同的性别代表条。
我没有足够的声誉来 post 图片所以这是 link 我想要的样子。
这是一个 link 看起来像我目前可以制作的东西。
谢谢!
最初我尝试使用 BarChart 对象来绘制双面条形图,但在查看 this question 之后我意识到 StackedBarChart 具有我正在寻找的东西。这是我用来为想知道如何执行此操作的其他人创建双面 histogram/bar 图表的代码:
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 HorizontalHistogramTest 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<Number, String> sbc =
new StackedBarChart<Number,String>(yAxis, xAxis);
final XYChart.Series<Number,String> series1 =
new XYChart.Series<Number,String>();
@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("Percent");
// plus value
series1.getData().add(new XYChart.Data<Number,String>(10, austria));
series1.getData().add(new XYChart.Data<Number,String>(50, brazil));
series1.getData().add(new XYChart.Data<Number,String>(40, france));
series1.getData().add(new XYChart.Data<Number,String>(50, italy));
series1.getData().add(new XYChart.Data<Number,String>(60, usa));
// minus value
series1.getData().add(new XYChart.Data<Number,String>(-90, austria));
series1.getData().add(new XYChart.Data<Number,String>(-50, brazil));
series1.getData().add(new XYChart.Data<Number,String>(-60, france));
series1.getData().add(new XYChart.Data<Number,String>(-50, italy));
series1.getData().add(new XYChart.Data<Number,String>(-40, usa));
Scene scene = new Scene(sbc, 800, 600);
sbc.getData().addAll(series1);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}