避雷选用 Matplot3D for JAVA,我引入jar包乱码,且不开源
避雷 jyz3d 高版本代码不兼容低版本的实例,高版本的教程需要另外收费
最终选择了使用Orson Charts, 一个用于 Java 平台的 3D 图表库,它支持多种类型的 3D 图表,包括线图、散点图、曲面图等。
(可用于JavaFX, Swing 和服务器端应用),下载地址:
http://www.object-refinery.com/orsoncharts/index.html
maven下载地址: https://mvnrepository.com/artifact/com.object-refinery/orsoncharts/1.7
这是1.7版本的,可以点击下载jar包进行导入项目,
读取本地test.txt文件中的三维数据,绘制三维曲线图:
public class OutBalsDisplayPanel extends javax.swing.JPanel {
private Chart3D chart3D;
private Chart3DPanel chartPanel;
private XYZSeriesCollection dataset;
public OutBalsDisplayPanel() {
initComponents();
readData();
createChartPanel();
}
private void createChartPanel() {
// 创建图表
chart3D = Chart3DFactory.createXYZLineChart(
"", //大标题
"", //子标题
dataset,
"xAxis",
"yAxis",
"zAxis"
);
chartPanel = new Chart3DPanel(chart3D);
chartPanel.setPreferredSize(new Dimension(842, 499));
jSplitPane1.setLeftComponent(chartOutPanel);
jSplitPane1.setRightComponent(jScrollPane1);
chartOutPanel.add(chartPanel, BorderLayout.CENTER);
chartOutPanel.revalidate();
chartOutPanel.repaint();
jSplitPane1.revalidate();
jSplitPane1.repaint();
}
private void readData() {
dataset = new XYZSeriesCollection();
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
br.readLine(); // 跳过标题行
String line;
List<Double> xSeries = new ArrayList<>();
List<Double> ySeries = new ArrayList<>();
List<Double> zSeries = new ArrayList<>();
while ((line = br.readLine()) != null) {
String[] values = line.split("\\s+");
double x = Double.parseDouble(values[0]);
double y = Double.parseDouble(values[1]);
double z = Double.parseDouble(values[2]);
xSeries.add(x);
ySeries.add(y);
zSeries.add(z);
}
// 添加系列
XYZSeries series = new XYZSeries("Series 1");
for (int i = 0; i < xSeries.size(); i++) {
double x = xSeries.get(i);
double y = ySeries.get(i);
double z = zSeries.get(i);
XYZDataItem dataItem = new XYZDataItem(x, y, z);
series.add(dataItem);
}
dataset.add(series);
} catch (Exception e) {
e.printStackTrace();
}
}
效果图如下:
可以旋转、缩放,但是本身不支持动画效果,需自己编写代码来逐步更新数据,并在每次更新后重新绘制图表