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

条形图的限制宽度大小

拓拔玺
2023-03-14

我创建了条形图的简单示例,但我注意到条形图的大小适合图表。我怎样才能限制尺寸?我想限制宽度大小。

共有1个答案

邹正阳
2023-03-14

正如我们在这里所讨论的,要设置每个条形图的最大宽度,我们必须在每次调整场景或图表的大小时相应地更改bargapcategorygap

与参考问题的唯一区别是,我们必须在第一次显示时调整图表的大小。

基于相同的代码,让我们创建setmaxbarwidth()方法:

private final NumberAxis yAxis = new NumberAxis();
private final CategoryAxis xAxis = new CategoryAxis();
private final BarChart<String,Number> bc = new BarChart<>(xAxis,yAxis);

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

    do{
        double catSpace = xAxis.getCategorySpacing();
        double avilableBarSpace = catSpace - (minCategoryGap + bc.getBarGap());
        barWidth = Math.min(maxBarWidth, (avilableBarSpace / bc.getData().size()) - bc.getBarGap());
        avilableBarSpace=(barWidth + bc.getBarGap())* bc.getData().size();
        bc.setCategoryGap(catSpace-avilableBarSpace-bc.getBarGap());
    } while(barWidth < maxBarWidth && bc.getCategoryGap()>minCategoryGap);
}
@Override 
public void start(Stage stage) {
    bc.setTitle("1");
    xAxis.setLabel("Groups");       
    yAxis.setLabel("Value");

    XYChart.Series series1 = new XYChart.Series();
    series1.setName("Groups");       
    series1.getData().add(new XYChart.Data("kk", 1));

    Scene scene  = new Scene(bc,800,600);
    bc.getData().addAll(series1);
    stage.setScene(scene);
    stage.show();

    setMaxBarWidth(40, 10);
    bc.widthProperty().addListener((obs,b,b1)->{
        Platform.runLater(()->setMaxBarWidth(40, 10));
    });
}

我已经用platform.runlater()包装了对setmaxbarwidth()的调用,这样场景图就有时间正确地刷新图表,避免了在while循环过程中多次重新绘制。另外,我已经将监听器移到bc.widthproperty(),以防图表嵌入到其他容器中。

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

  • 问题内容: 当文字到达图片的右侧时,如何将文字包裹在其中? 这是笔:http : //codepen.io/mjankowski/pen/pbzejy 在上述情况下,第二个图形标题移动到图像的右侧之外。我希望它在“ Longname”之后换行。 另外,对于更简单的方法,也欢迎提出建议。我只希望图像/标题整洁。 谢谢,马特 问题答案: 一种方法是使您的元素具有弹性容器,并将其对齐方式设置为。这样可以

  • 我的一个程序中的java类遇到了一个奇怪的问题。谢天谢地,我能够使用示例取自Oracle网站: https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/FrameDemoProject/src/c

  • 问题内容: 有人可以告诉我如何修改此使用matplotlib的Python代码,以便无论绘制多少分,条的宽度都将保持恒定吗?先感谢您! 问题答案: 条的宽度相同!它们看起来不一样的原因是因为您正在使用以下行: 这将更改您的x值,从而更改x轴的比例。为了抵消这种影响,您可以更改x轴的限制,也可以使条形宽度取决于分数的数量,例如,如果0.35的宽度适用于10个分数,那么如果将分数的数量加倍,条宽度的一

  • 我需要限制节点的子级大小。我的父节点是一个VBox。我试图设置maxWidth,但它不起作用(wide子级不在VBox范围内) 如何将孩子的大小限制在父母的范围内?除了绑定还有别的办法吗? 预期行为:Children maxWidth自动与VBox相同(无需手动设置) 我的代码(fxml):