为什么图形很大时x轴消失了
Why does the x axis disappear when the graph very big
我正在尝试使用 JFreeChart
加载大图。但是,当缓冲图像超过一定大小时,X 轴出现问题。 X 轴上的值消失。这可以在图像的第三个图表中看到。
如果能帮助我解决问题,我将不胜感激
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Program2 extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
try {
StackPane p = new StackPane();
primaryStage.setTitle("Chart Application");
Label loader = new Label("Loading...");
loader.setGraphic(new ImageView(new Image("https://media.giphy.com/media/FmcNeI0PnsAKs/giphy.gif")));
loader.setFont(new javafx.scene.text.Font(35));
p.setStyle("-fx-background: #FFFFFF;");
p.getChildren().add(loader);
StackPane.setAlignment(loader, Pos.CENTER);
Scene scene = new Scene(p, 600, 600);
primaryStage.setScene(scene);
primaryStage.setMaximized(true);
Task<ArrayList<ImageView>> loadInitial = new Task<ArrayList<ImageView>>() {
@Override
public ArrayList<ImageView> call() {
ArrayList<ImageView> images = new ArrayList<ImageView>();
XYSeries data = new XYSeries(1);
for(int j = 0; j <= 100; j += 2) {
data.add(j, -0.2);
data.add(j, 1);
data.add(j + 1, 1);
data.add(j + 1, -0.2);
}
XYSeriesCollection dataset = new XYSeriesCollection(data);
JFreeChart chart = ChartFactory.createXYAreaChart("", "", "", dataset, PlotOrientation.VERTICAL, false, false, false);
chart.setBackgroundPaint(Color.WHITE);
chart.setBorderVisible(false);
chart.setAntiAlias(true);
XYPlot plot = (XYPlot) chart.getPlot();
ValueAxis range = plot.getRangeAxis();
range.setLowerMargin(0);
range.setUpperMargin(0);
range.setVisible(false);
ValueAxis domainAxis = plot.getDomainAxis();
domainAxis.setLowerMargin(0);
domainAxis.setUpperMargin(0);
BufferedImage capture = chart.createBufferedImage(1000, 50);
ImageView imageView = new ImageView();
Image chartImg = SwingFXUtils.toFXImage(capture, null);
imageView.setImage(chartImg);
images.add(imageView);
BufferedImage capture2 = chart.createBufferedImage(10000, 50);
ImageView imageView2 = new ImageView();
Image chartImg2 = SwingFXUtils.toFXImage(capture2, null);
imageView2.setImage(chartImg2);
images.add(imageView2);
BufferedImage capture3 = chart.createBufferedImage(100000, 50);
ImageView imageView3 = new ImageView();
Image chartImg3 = SwingFXUtils.toFXImage(capture3, null);
imageView3.setImage(chartImg3);
images.add(imageView3);
return images;
}
};
loadInitial.setOnSucceeded(e -> {
VBox images = new VBox();
ArrayList<ImageView> result = loadInitial.getValue();
for(ImageView image : result) {
images.getChildren().add(image);
}
ScrollPane scrollPane = new ScrollPane(images);
scrollPane.setStyle("-fx-background: #FFFFFF;");
scene.setRoot(scrollPane);
});
new Thread(loadInitial).start();
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意
我也发了here
这个问题是因为当图表很大时 ticks
(轴上的标记)的数量超过了 ValueAxis.MAXIMUM_TICK_COUNT
。
为了解决这个问题,您可以使用增加的 ValueAxis.MAXIMUM_TICK_COUNT
值重建包,或者您可以编写一个方法来设置最大滴答计数,然后重建包。这将允许您在不同的 java 文件中设置刻度数。这可能是一种方法,例如 ValueAxis.setMaximumTickCount(int ticks)
取自here
编辑
为了实现这一点,我编辑了 org.jfree.chart.axis
中的两个文件; ValueAxis.java
和 NumberAxis.java
.
更改为 ValueAxis.java
。我将以下内容添加到 class.
的底部
private int maxTicks = MAXIMUM_TICK_COUNT;
public void setMaxTicks(int max) {
maxTicks = max;
}
public int getMaxTicks() {
return maxTicks;
}
更改为 NumberAxis.java
。
在 957
行和 1052
行中,我更改了
中的 if 语句
if (count <= ValueAxis.MAXIMUM_TICK_COUNT) {
到
if (count <= getMaxTicks()) {
最后我用Apache Ant
重建了它
我正在尝试使用 JFreeChart
加载大图。但是,当缓冲图像超过一定大小时,X 轴出现问题。 X 轴上的值消失。这可以在图像的第三个图表中看到。
如果能帮助我解决问题,我将不胜感激
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Program2 extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
try {
StackPane p = new StackPane();
primaryStage.setTitle("Chart Application");
Label loader = new Label("Loading...");
loader.setGraphic(new ImageView(new Image("https://media.giphy.com/media/FmcNeI0PnsAKs/giphy.gif")));
loader.setFont(new javafx.scene.text.Font(35));
p.setStyle("-fx-background: #FFFFFF;");
p.getChildren().add(loader);
StackPane.setAlignment(loader, Pos.CENTER);
Scene scene = new Scene(p, 600, 600);
primaryStage.setScene(scene);
primaryStage.setMaximized(true);
Task<ArrayList<ImageView>> loadInitial = new Task<ArrayList<ImageView>>() {
@Override
public ArrayList<ImageView> call() {
ArrayList<ImageView> images = new ArrayList<ImageView>();
XYSeries data = new XYSeries(1);
for(int j = 0; j <= 100; j += 2) {
data.add(j, -0.2);
data.add(j, 1);
data.add(j + 1, 1);
data.add(j + 1, -0.2);
}
XYSeriesCollection dataset = new XYSeriesCollection(data);
JFreeChart chart = ChartFactory.createXYAreaChart("", "", "", dataset, PlotOrientation.VERTICAL, false, false, false);
chart.setBackgroundPaint(Color.WHITE);
chart.setBorderVisible(false);
chart.setAntiAlias(true);
XYPlot plot = (XYPlot) chart.getPlot();
ValueAxis range = plot.getRangeAxis();
range.setLowerMargin(0);
range.setUpperMargin(0);
range.setVisible(false);
ValueAxis domainAxis = plot.getDomainAxis();
domainAxis.setLowerMargin(0);
domainAxis.setUpperMargin(0);
BufferedImage capture = chart.createBufferedImage(1000, 50);
ImageView imageView = new ImageView();
Image chartImg = SwingFXUtils.toFXImage(capture, null);
imageView.setImage(chartImg);
images.add(imageView);
BufferedImage capture2 = chart.createBufferedImage(10000, 50);
ImageView imageView2 = new ImageView();
Image chartImg2 = SwingFXUtils.toFXImage(capture2, null);
imageView2.setImage(chartImg2);
images.add(imageView2);
BufferedImage capture3 = chart.createBufferedImage(100000, 50);
ImageView imageView3 = new ImageView();
Image chartImg3 = SwingFXUtils.toFXImage(capture3, null);
imageView3.setImage(chartImg3);
images.add(imageView3);
return images;
}
};
loadInitial.setOnSucceeded(e -> {
VBox images = new VBox();
ArrayList<ImageView> result = loadInitial.getValue();
for(ImageView image : result) {
images.getChildren().add(image);
}
ScrollPane scrollPane = new ScrollPane(images);
scrollPane.setStyle("-fx-background: #FFFFFF;");
scene.setRoot(scrollPane);
});
new Thread(loadInitial).start();
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意
我也发了here
这个问题是因为当图表很大时 ticks
(轴上的标记)的数量超过了 ValueAxis.MAXIMUM_TICK_COUNT
。
为了解决这个问题,您可以使用增加的 ValueAxis.MAXIMUM_TICK_COUNT
值重建包,或者您可以编写一个方法来设置最大滴答计数,然后重建包。这将允许您在不同的 java 文件中设置刻度数。这可能是一种方法,例如 ValueAxis.setMaximumTickCount(int ticks)
取自here
编辑
为了实现这一点,我编辑了 org.jfree.chart.axis
中的两个文件; ValueAxis.java
和 NumberAxis.java
.
更改为 ValueAxis.java
。我将以下内容添加到 class.
private int maxTicks = MAXIMUM_TICK_COUNT;
public void setMaxTicks(int max) {
maxTicks = max;
}
public int getMaxTicks() {
return maxTicks;
}
更改为 NumberAxis.java
。
在 957
行和 1052
行中,我更改了
if (count <= ValueAxis.MAXIMUM_TICK_COUNT) {
到
if (count <= getMaxTicks()) {
最后我用Apache Ant
重建了它