对齐多个XYChart的X轴 [英] Aligning the X axes of several XYCharts
问题描述
我有两个要垂直显示的XYChart
.
两个图共享相同的x轴,但是它们使用不同的数据集,这些值的大小顺序不同.这使得y轴标签的大小完全不同.最后,两个x轴不再对齐.
我的目标是对齐那些x轴.
一个提出的解决方案提供了一种解决方法,即旋转y轴标签,使标签宽度相同.尽管这可行(并且我感谢贡献者的回答),但这并不完全令人满意:一旦我有了大小不同的图例,我就会面临相同的问题(请参见
出于可重复性考虑,下面是从 Oracle的示例构建的示例.教程: 这是结果: 是否可以控制图表组件的大小以使两个x轴对齐? 我尝试更改首选的y轴和最小宽度,但似乎不起作用. 此刻我正在使用Java 8.如有必要,可以迁移到Java 9. 编辑:如答案中所建议,我已将这个问题的范围缩小到了x轴对齐的问题.在此处询问尺寸问题. 摆脱
完整代码:
I have two The two graphs share the same x axis, but they use different data sets, which values are not of the same order of magnitude. This makes the y axis labels quite different in size. In the end, the two x axes are not aligned anymore. My objective is to align those x axes. One proposed solution offers a workaround by rotating the y axis labels, making the label width identical. While this works (and I thank the contributor for his answer), this is not entirely satisfactory: as soon as I have legends that have different sizes, I'm facing the same problem (see this question in R, where several satisfying solutions where found). I really would like to keep the label orientation unchanged and "play" with the chart components size. For the sake of reproducibility, here is an example built from Oracle's tutorial: Here is the result: Is it possible to control the size of the chart component to make the two x axis aligned? I have tried to change the y axis prefered and minimum width but it does not seem to work. I'm using Java 8 at the moment. Migrating to Java 9 is possible if necessary. Edit: As suggested in the answers, I have reduced the scope of this question to the issue of aligning the x axes. The sizing issue is asked here. Get rid of the
Full code:
这篇关于对齐多个XYChart的X轴的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("Line Chart Sample");
final CategoryAxis xAxis1 = new CategoryAxis();
final NumberAxis yAxis1 = new NumberAxis();
xAxis1.setLabel("Month");
final LineChart<String, Number> lineChart1 =
new LineChart<>(xAxis1, yAxis1);
final CategoryAxis xAxis2 = new CategoryAxis();
xAxis2.setLabel("Month");
final NumberAxis yAxis2 = new NumberAxis();
final LineChart<String, Number> lineChart2 =
new LineChart<>(xAxis2, yAxis2);
lineChart1.setTitle("Charts");
lineChart1.setLegendVisible(false);
lineChart2.setLegendVisible(false);
XYChart.Series series1 = new XYChart.Series();
series1.setName("Portfolio 1");
series1.getData().add(new XYChart.Data("Jan", 23));
series1.getData().add(new XYChart.Data("Feb", 14));
series1.getData().add(new XYChart.Data("Mar", 15));
series1.getData().add(new XYChart.Data("Apr", 24));
series1.getData().add(new XYChart.Data("May", 34));
series1.getData().add(new XYChart.Data("Jun", 36));
series1.getData().add(new XYChart.Data("Jul", 22));
series1.getData().add(new XYChart.Data("Aug", 45));
series1.getData().add(new XYChart.Data("Sep", 43));
series1.getData().add(new XYChart.Data("Oct", 17));
series1.getData().add(new XYChart.Data("Nov", 29));
series1.getData().add(new XYChart.Data("Dec", 25));
XYChart.Series series2 = new XYChart.Series();
series2.setName("Portfolio 2");
series2.getData().add(new XYChart.Data("Jan", 330000));
series2.getData().add(new XYChart.Data("Feb", 340000));
series2.getData().add(new XYChart.Data("Mar", 250000));
series2.getData().add(new XYChart.Data("Apr", 440000));
series2.getData().add(new XYChart.Data("May", 390000));
series2.getData().add(new XYChart.Data("Jun", 160000));
series2.getData().add(new XYChart.Data("Jul", 550000));
series2.getData().add(new XYChart.Data("Aug", 540000));
series2.getData().add(new XYChart.Data("Sep", 480000));
series2.getData().add(new XYChart.Data("Oct", 270000));
series2.getData().add(new XYChart.Data("Nov", 370000));
series2.getData().add(new XYChart.Data("Dec", 290000));
lineChart1.getData().addAll(series1);
lineChart2.getData().addAll(series2);
VBox vBox = new VBox();
vBox.addAll(lineChart1, lineChart2);
Scene scene = new Scene(gridPane, 800, 600);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
GridPane
代码并将其替换为:VBox vBox = new VBox(lineChart1, lineChart2);
Scene scene = new Scene(vBox, 800, 600);
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication139 extends Application
{
@Override
public void start(Stage primaryStage)
{
primaryStage.setTitle("Line Chart Sample");
final CategoryAxis xAxis1 = new CategoryAxis();
final NumberAxis yAxis1 = new NumberAxis();
xAxis1.setLabel("Month");
final LineChart<String, Number> lineChart1
= new LineChart<>(xAxis1, yAxis1);
final CategoryAxis xAxis2 = new CategoryAxis();
xAxis2.setLabel("Month");
final NumberAxis yAxis2 = new NumberAxis();
final LineChart<String, Number> lineChart2
= new LineChart<>(xAxis2, yAxis2);
lineChart1.setTitle("Charts");
lineChart1.setLegendVisible(false);
lineChart1.getYAxis().setTickLabelRotation(270);
lineChart2.setLegendVisible(false);
lineChart2.getYAxis().setTickLabelRotation(270);
XYChart.Series series1 = new XYChart.Series();
series1.setName("Portfolio 1");
series1.getData().add(new XYChart.Data("Jan", 23));
series1.getData().add(new XYChart.Data("Feb", 14));
series1.getData().add(new XYChart.Data("Mar", 15));
series1.getData().add(new XYChart.Data("Apr", 24));
series1.getData().add(new XYChart.Data("May", 34));
series1.getData().add(new XYChart.Data("Jun", 36));
series1.getData().add(new XYChart.Data("Jul", 22));
series1.getData().add(new XYChart.Data("Aug", 45));
series1.getData().add(new XYChart.Data("Sep", 43));
series1.getData().add(new XYChart.Data("Oct", 17));
series1.getData().add(new XYChart.Data("Nov", 29));
series1.getData().add(new XYChart.Data("Dec", 25));
XYChart.Series series2 = new XYChart.Series();
series2.setName("Portfolio 2");
series2.getData().add(new XYChart.Data("Jan", 330000));
series2.getData().add(new XYChart.Data("Feb", 340000));
series2.getData().add(new XYChart.Data("Mar", 250000));
series2.getData().add(new XYChart.Data("Apr", 440000));
series2.getData().add(new XYChart.Data("May", 390000));
series2.getData().add(new XYChart.Data("Jun", 160000));
series2.getData().add(new XYChart.Data("Jul", 550000));
series2.getData().add(new XYChart.Data("Aug", 540000));
series2.getData().add(new XYChart.Data("Sep", 480000));
series2.getData().add(new XYChart.Data("Oct", 270000));
series2.getData().add(new XYChart.Data("Nov", 370000));
series2.getData().add(new XYChart.Data("Dec", 290000));
lineChart1.getData().addAll(series1);
lineChart2.getData().addAll(series2);
VBox vBox = new VBox(lineChart1, lineChart2);
Scene scene = new Scene(vBox, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}
XYChart
s that I want to display vertically aligned.import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("Line Chart Sample");
final CategoryAxis xAxis1 = new CategoryAxis();
final NumberAxis yAxis1 = new NumberAxis();
xAxis1.setLabel("Month");
final LineChart<String, Number> lineChart1 =
new LineChart<>(xAxis1, yAxis1);
final CategoryAxis xAxis2 = new CategoryAxis();
xAxis2.setLabel("Month");
final NumberAxis yAxis2 = new NumberAxis();
final LineChart<String, Number> lineChart2 =
new LineChart<>(xAxis2, yAxis2);
lineChart1.setTitle("Charts");
lineChart1.setLegendVisible(false);
lineChart2.setLegendVisible(false);
XYChart.Series series1 = new XYChart.Series();
series1.setName("Portfolio 1");
series1.getData().add(new XYChart.Data("Jan", 23));
series1.getData().add(new XYChart.Data("Feb", 14));
series1.getData().add(new XYChart.Data("Mar", 15));
series1.getData().add(new XYChart.Data("Apr", 24));
series1.getData().add(new XYChart.Data("May", 34));
series1.getData().add(new XYChart.Data("Jun", 36));
series1.getData().add(new XYChart.Data("Jul", 22));
series1.getData().add(new XYChart.Data("Aug", 45));
series1.getData().add(new XYChart.Data("Sep", 43));
series1.getData().add(new XYChart.Data("Oct", 17));
series1.getData().add(new XYChart.Data("Nov", 29));
series1.getData().add(new XYChart.Data("Dec", 25));
XYChart.Series series2 = new XYChart.Series();
series2.setName("Portfolio 2");
series2.getData().add(new XYChart.Data("Jan", 330000));
series2.getData().add(new XYChart.Data("Feb", 340000));
series2.getData().add(new XYChart.Data("Mar", 250000));
series2.getData().add(new XYChart.Data("Apr", 440000));
series2.getData().add(new XYChart.Data("May", 390000));
series2.getData().add(new XYChart.Data("Jun", 160000));
series2.getData().add(new XYChart.Data("Jul", 550000));
series2.getData().add(new XYChart.Data("Aug", 540000));
series2.getData().add(new XYChart.Data("Sep", 480000));
series2.getData().add(new XYChart.Data("Oct", 270000));
series2.getData().add(new XYChart.Data("Nov", 370000));
series2.getData().add(new XYChart.Data("Dec", 290000));
lineChart1.getData().addAll(series1);
lineChart2.getData().addAll(series2);
VBox vBox = new VBox();
vBox.addAll(lineChart1, lineChart2);
Scene scene = new Scene(gridPane, 800, 600);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
GridPane
code and replace it with:VBox vBox = new VBox(lineChart1, lineChart2);
Scene scene = new Scene(vBox, 800, 600);
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication139 extends Application
{
@Override
public void start(Stage primaryStage)
{
primaryStage.setTitle("Line Chart Sample");
final CategoryAxis xAxis1 = new CategoryAxis();
final NumberAxis yAxis1 = new NumberAxis();
xAxis1.setLabel("Month");
final LineChart<String, Number> lineChart1
= new LineChart<>(xAxis1, yAxis1);
final CategoryAxis xAxis2 = new CategoryAxis();
xAxis2.setLabel("Month");
final NumberAxis yAxis2 = new NumberAxis();
final LineChart<String, Number> lineChart2
= new LineChart<>(xAxis2, yAxis2);
lineChart1.setTitle("Charts");
lineChart1.setLegendVisible(false);
lineChart1.getYAxis().setTickLabelRotation(270);
lineChart2.setLegendVisible(false);
lineChart2.getYAxis().setTickLabelRotation(270);
XYChart.Series series1 = new XYChart.Series();
series1.setName("Portfolio 1");
series1.getData().add(new XYChart.Data("Jan", 23));
series1.getData().add(new XYChart.Data("Feb", 14));
series1.getData().add(new XYChart.Data("Mar", 15));
series1.getData().add(new XYChart.Data("Apr", 24));
series1.getData().add(new XYChart.Data("May", 34));
series1.getData().add(new XYChart.Data("Jun", 36));
series1.getData().add(new XYChart.Data("Jul", 22));
series1.getData().add(new XYChart.Data("Aug", 45));
series1.getData().add(new XYChart.Data("Sep", 43));
series1.getData().add(new XYChart.Data("Oct", 17));
series1.getData().add(new XYChart.Data("Nov", 29));
series1.getData().add(new XYChart.Data("Dec", 25));
XYChart.Series series2 = new XYChart.Series();
series2.setName("Portfolio 2");
series2.getData().add(new XYChart.Data("Jan", 330000));
series2.getData().add(new XYChart.Data("Feb", 340000));
series2.getData().add(new XYChart.Data("Mar", 250000));
series2.getData().add(new XYChart.Data("Apr", 440000));
series2.getData().add(new XYChart.Data("May", 390000));
series2.getData().add(new XYChart.Data("Jun", 160000));
series2.getData().add(new XYChart.Data("Jul", 550000));
series2.getData().add(new XYChart.Data("Aug", 540000));
series2.getData().add(new XYChart.Data("Sep", 480000));
series2.getData().add(new XYChart.Data("Oct", 270000));
series2.getData().add(new XYChart.Data("Nov", 370000));
series2.getData().add(new XYChart.Data("Dec", 290000));
lineChart1.getData().addAll(series1);
lineChart2.getData().addAll(series2);
VBox vBox = new VBox(lineChart1, lineChart2);
Scene scene = new Scene(vBox, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}