当前位置: 首页 > 知识库问答 >
问题:

堆叠条形图的限制宽度大小

西门品
2023-03-14
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.application.Platform;
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.scene.layout.HBox;
import javafx.stage.Stage;

public class MainApp extends Application
{

    private StackedBarChart<String, Number> stackedChart;
    private List<EventsObj> eventsObj;

    @Override
    public void start(Stage stage) throws Exception
    {
        createStackedChart();
        List<EventsObj> testData = generateTestData();

        addStackedChartData(testData);

        HBox hb = new HBox();
        hb.getChildren().add(stackedChart);

        Scene scene = new Scene(hb);
        stage.setTitle("JavaFX and Maven");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }

    private void createStackedChart()
    {
        CategoryAxis xAxis = new CategoryAxis();
        xAxis.setLabel("Days");
        NumberAxis yAxis = new NumberAxis();

        stackedChart = new StackedBarChart<>(xAxis, yAxis);
        stackedChart.setCategoryGap(20);

        stackedChart.widthProperty().addListener((obs, b, b1) ->
        {
            // Chart Bar column is not automatically resized. We need to wait for next JavaFX releases to fix this.
            Platform.runLater(() -> setMaxBarWidth(stackedChart, xAxis, 40, 10));
        });
    }

    private List<EventsObj> generateTestData()
    {
        eventsObj = new ArrayList<>();

        for (int i = 0; i < 5; i++)
        {
            eventsObj.add(new EventsObj(String.valueOf(randomDate()), random(2, 60), random(2, 60), random(2, 60), random(2, 60)));
        }

        return eventsObj;
    }

    public static int random(int lowerBound, int upperBound)
    {
        return (lowerBound + (int) Math.round(Math.random() * (upperBound - lowerBound)));
    }

    private LocalDate randomDate()
    {
        Random random = new Random();
        int minDay = (int) LocalDate.of(1900, 1, 1).toEpochDay();
        int maxDay = (int) LocalDate.of(2015, 1, 1).toEpochDay();
        long randomDay = minDay + random.nextInt(maxDay - minDay);

        LocalDate randomBirthDate = LocalDate.ofEpochDay(randomDay);

        return randomBirthDate;
    }

    private void addStackedChartData(List<EventsObj> data)
    {
        List<XYChart.Series<String, Number>> dataSeries = new ArrayList<>(data.size());

        for (EventsObj data1 : data)
        {
            final XYChart.Series<String, Number> series1 = new XYChart.Series<>();
            series1.setName(data1.getDate());
            series1.getData().setAll(
                new XYChart.Data<>("Info", data1.getInfo()));
            dataSeries.add(series1);
        }

        stackedChart.getData().setAll(dataSeries);
    }

    private void setMaxBarWidth(StackedBarChart<String, Number> bc, CategoryAxis xAxis, double maxBarWidth, double minCategoryGap)
    {
        double barWidth = 0;
        do
        {
            double catSpace = xAxis.getCategorySpacing();
            double avilableBarSpace = catSpace - (bc.getCategoryGap() + bc.getCategoryGap());
            barWidth = (avilableBarSpace / bc.getData().size()) - bc.getCategoryGap();
            if (barWidth > maxBarWidth)
            {
                avilableBarSpace = (maxBarWidth + bc.getCategoryGap()) * bc.getData().size();
                bc.setCategoryGap(catSpace - avilableBarSpace - bc.getCategoryGap());
            }
        }
        while (barWidth > maxBarWidth);

        do
        {
            double catSpace = xAxis.getCategorySpacing();
            double avilableBarSpace = catSpace - (minCategoryGap + bc.getCategoryGap());
            barWidth = Math.min(maxBarWidth, (avilableBarSpace / bc.getData().size()) - bc.getCategoryGap());
            avilableBarSpace = (barWidth + bc.getCategoryGap()) * bc.getData().size();
            bc.setCategoryGap(catSpace - avilableBarSpace - bc.getCategoryGap());
        }
        while (barWidth < maxBarWidth && bc.getCategoryGap() > minCategoryGap);
    }
}

共有1个答案

钱承允
2023-03-14

barchart图表中,添加的不同系列在同一类别的不同列中用barGap(中间有一定间距)绘制。

但是在StackBarchart图表中,不同的系列被绘制成堆叠在同一列中,因此在本例中没有条形间隙。

如果您从这个答案中选取setMaxBarwidth()方法,那么您所需要做的就是将bc.getbargap()设置为0,并将sbc.getdata().size()设置为1。在这种情况下,不需要迭代。

这将是新的方法,真的简化了:

private void setMaxCategoryWidth(double maxCategoryWidth, double minCategoryGap){
    double catSpace = xAxis.getCategorySpacing();
    sbc.setCategoryGap(catSpace - Math.min(maxCategoryWidth, catSpace - minCategoryGap));
}

基本上,您所要做的就是从类别的初始宽度减去所需的类别宽度,然后将这个额外的空间放入CategoryGap中。

现在,您可以创建图表:

StackedBarChart<String, Number> sbc =  new StackedBarChart<>(xAxis, yAxis);
setMaxCategoryWidth(40, 10);
sbc.widthProperty().addListener((obs, b, b1) -> {
    Platform.runLater(() -> setMaxCategoryWidth(40, 10));
});
 类似资料:
  • 我创建了条形图的简单示例,但我注意到条形图的大小适合图表。我怎样才能限制尺寸?我想限制宽度大小。

  • 我正在使用chartjs版本:2.1.4在MVC应用程序中创建图表。我正在使用控制条形图的宽度,以进行固定宽度设置。它在只有条形图的情况下工作正常,但在“堆叠条形图”的情况下,我无法确定条形图的宽度。我正在使用以下代码创建堆叠条形图,如下所示: 在这种情况下,"barper"属性不起作用。请在"chartjs版本: 2.1.4"中建议我解决方案。 提前谢谢

  • 我有以下不同月份的数据 一月:[1,5,3] Feb:[10,5] 三月:[4,8] 四月:[7] 可能:[3,1,5,0,7] 我想生成如下所示的条形图 现在,我有以下代码,我想知道如何生成如上图所示的条形图。 }); 非常感谢。

  • Highcharts 条形图 以下实例演示了堆叠条形图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。 配置 plotOptions 配置图表堆叠使用 plotOptions.series.stacking,并设置为 "normal"。如果禁用堆叠可设置为 null , "normal" 通过值设置堆叠, "percent" 堆叠则按百分比。 v

  • 我需要一张这样的图表: 我找到了这个示例,但它使用了旧版本的。我尝试使用v2.0,但我不明白。 有人能贴个例子吗?

  • 问题内容: 我使用以下代码处理了一个简单的3d条形图: 认为这只是一个测试,到目前为止,一切似乎都还很清楚。我只是想知道如何以堆叠的方式绘制这9个条形图的每一个,以便例如将每个条形图分成4个部分,组成整个条形图。 基本上,我想以此处的示例方式执行此操作。 但是,我希望有2个堆栈,而不是2个堆栈。有什么想法可以从我现在的角度出发吗?每个提示将不胜感激。 谢谢! 编辑:如果我想实现每个堆叠的酒吧给定的