【Java万花筒】数据可视化利器:Java图表和图形库全面对比

本文主要是介绍【Java万花筒】数据可视化利器:Java图表和图形库全面对比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java图表和图形库概述:选择最适合你的数据可视化工具

前言

在数据驱动的世界中,数据可视化是一种强大的工具,用于展示和理解数据。Java开发人员可以利用各种图表和图形库来创建各种各样的图表和图形,以满足不同的数据可视化需求。本文将介绍几个流行的Java图表和图形库,包括JFreeChart、JUNG、JavaFX Charts、Apache Batik、Processing和Apache POI。通过了解这些库的概述、特点、功能与用途,读者将能够选择最适合自己项目需求的工具。

欢迎订阅专栏:Java万花筒

文章目录

  • Java图表和图形库概述:选择最适合你的数据可视化工具
    • 前言
    • 1. JFreeChart
      • 1.1 概述
      • 1.2 特点与优势
      • 1.3 应用场景
      • 1.4 使用示例
      • 1.5 图表样式和配置选项
    • 2. JUNG (Java Universal Network/Graph Framework)
      • 2.1 概述
      • 2.2 功能与用途
        • 2.2.1 图的创建与操作
        • 2.2.2 图的布局与可视化
      • 2.3 图的算法与分析
        • 2.3.1 最短路径算法
        • 2.3.2 社区发现算法
    • 3. JavaFX Charts
      • 3.1 概述
      • 3.2 图表类型与用途
        • 3.2.1 折线图
        • 3.2.2 饼图
        • 3.2.3 柱状图
      • 3.3 图表样式与定制
        • 3.3.1 颜色和样式
        • 3.3.2 标题和标签
    • 4. Apache Batik (用于处理可扩展矢量图形SVG)
      • 4.1 概述
      • 4.2 功能与用途
      • 4.3 SVG滤镜效果
        • 4.3.1 模糊滤镜
        • 4.3.2 阴影效果
    • 5. Processing (用于创作互动图形和动画)
      • 5.1 概述
      • 5.2 特点与应用场景
      • 5.3 绘图和形状
        • 5.3.1 绘制基本形状
        • 5.3.2 绘制复杂形状
    • 6. Apache POI (用于操作Microsoft Office文档)
      • 6.1 概述
      • 6.2 功能与应用
      • 6.3 图表生成
    • 总结

1. JFreeChart

1.1 概述

JFreeChart是一个开源的Java图表库,用于创建各种类型的图表,包括折线图、柱状图、饼图、散点图等。它提供了丰富的功能和灵活的配置选项,可以满足不同的图表需求。

1.2 特点与优势

  • 多种图表类型:JFreeChart支持多种常见的图表类型,如折线图、柱状图、饼图、散点图等,可以根据需求选择合适的图表类型。
  • 数据可视化:可以将数据以图表的形式展示出来,帮助用户更直观地理解和分析数据。
  • 自定义配置:JFreeChart提供了丰富的配置选项,可以自定义图表的外观、颜色、字体等,以及图表的交互操作。
  • 导出功能:可以将图表导出为图片文件或打印出来,便于在文档或报告中使用。

1.3 应用场景

JFreeChart可以应用于各种场景,包括但不限于:

  • 数据分析与可视化:通过绘制折线图、柱状图、饼图等,可以将数据以图表的形式呈现,帮助用户更直观地分析和理解数据。
  • 统计报告:将统计数据以图表的形式展示出来,可以使报告更具有说服力和可读性。
  • 业务监控:通过绘制实时数据的动态图表,可以监控业务的实时状态和趋势变化。
  • 数据可视化工具:作为开发库,可以被集成到数据可视化工具中,为用户提供强大的图表功能。
  • 学术研究:在学术研究中,可以使用JFreeChart绘制图表,帮助展示实验结果、趋势变化等。

1.4 使用示例

以下是一个使用JFreeChart绘制折线图的简单示例:

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.xy.DefaultXYDataset;public class LineChartExample {public static void main(String[] args) {// 创建数据集DefaultXYDataset dataset = new DefaultXYDataset();double[][] data = {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10}};dataset.addSeries("Series 1", data);// 创建折线图JFreeChart chart = ChartFactory.createXYLineChart("Line Chart", // 图表标题"X", // x轴标签"Y", // y轴标签dataset // 数据集);// 创建图表窗口并显示图表ChartFrame frame = new ChartFrame("Line Chart Example", chart);frame.pack();frame.setVisible(true);}
}

运行上述代码,将会弹出一个窗口显示绘制的折线图。

1.5 图表样式和配置选项

JFreeChart提供了丰富的图表样式和配置选项,可以根据需求进行定制。以下是一些常用的配置选项:

  • 标题设置:可以设置图表的标题、副标题、字体样式和颜色等。
  • 轴设置:可以设置x轴和y轴的标签、标签字体、刻度线样式、刻度线颜色等。
  • 图例设置:可以设置图例的位置、字体、背景颜色等。
  • 数据项设置:可以设置每个数据项的颜色、形状、标签等。
  • 背景设置:可以设置图表的背景颜色、边框、边框颜色等。

以下是一个示例,展示如何自定义JFreeChart图表的样式和配置选项:

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;public class CustomChartExample {public static void main(String[] args) {// 创建数据集DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(1, "Series 1", "Category 1");dataset.addValue(2, "Series 1", "Category 2");dataset.addValue(3, "Series 1", "Category 3");dataset.addValue(4, "Series 1", "Category 4");dataset.addValue(5, "Series 1", "Category 5");// 创建柱状图JFreeChart chart = ChartFactory.createBarChart("Bar Chart", // 图表标题"Category", // x轴标签"Value", // y轴标签dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向true, // 是否显示图例true, // 是否生成工具提示false // 是否生成URL链接);// 设置标题字体样式和颜色chart.getTitle().setFont(new Font("Arial", Font.BOLD, 18));chart.getTitle().setPaint(Color.BLUE);// 设置轴标签字体样式和颜色chart.getCategoryPlot().getDomainAxis().setLabelFont(new Font("Arial", Font.PLAIN, 12));chart.getCategoryPlot().getDomainAxis().setLabelPaint(Color.BLACK);chart.getCategoryPlot().getRangeAxis().setLabelFont(new Font("Arial", Font.PLAIN, 12));chart.getCategoryPlot().getRangeAxis().setLabelPaint(Color.BLACK);// 设置图例字体样式和颜色chart.getLegend().setItemFont(new Font("Arial", Font.PLAIN, 12));chart.getLegend().setItemPaint(Color.GRAY);// 设置数据项颜色chart.getCategoryPlot().getRenderer().setSeriesPaint(0, Color.RED);// 设置图表背景颜色chart.getPlot().setBackgroundPaint(Color.LIGHT_GRAY);// 创建图表窗口并显示图表ChartFrame frame = new ChartFrame("Custom Chart Example", chart);frame.pack();frame.setVisible(true);}
}

运行上述代码,将会弹出一个窗口显示自定义风格的柱状图。

2. JUNG (Java Universal Network/Graph Framework)

2.1 概述

JUNG是一个用于创建、操作和可视化各种类型的图(包括有向图和无向图)的Java框架。它提供了一系列的图形算法和数据结构,用于图的布局、分析和可视化。

2.2 功能与用途

2.2.1 图的创建与操作

JUNG提供了创建和操作图的功能,包括添加顶点和边、删除顶点和边、遍历图等。可以使用JUNG提供的数据结构,如DirectedSparseGraph和UndirectedSparseGraph,来创建有向图和无向图。

例如,下面是一个使用JUNG创建有向图的示例代码:

import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.graph.util.EdgeType;public class JUNGGraphExample {public static void main(String[] args) {// 创建有向图DirectedGraph<Integer, String> graph = new DirectedSparseGraph<>();// 添加顶点graph.addVertex(1);graph.addVertex(2);graph.addVertex(3);// 添加边graph.addEdge("Edge 1", 1, 2, EdgeType.DIRECTED);graph.addEdge("Edge 2", 2, 3, EdgeType.DIRECTED);graph.addEdge("Edge 3", 3, 1, EdgeType.DIRECTED);// 输出图的信息System.out.println("顶点数量:" + graph.getVertexCount());System.out.println("边数量:" + graph.getEdgeCount());System.out.println("所有顶点:" + graph.getVertices());System.out.println("所有边:" + graph.getEdges());}
}

这个示例代码使用JUNG创建了一个有向图,通过DirectedSparseGraph类创建有向图对象,然后使用addVertex方法添加顶点,使用addEdge方法添加边。最后,使用getVertexCount和getEdgeCount方法获取顶点数量和边数量,使用getVertices和getEdges方法获取所有顶点和边的信息。

2.2.2 图的布局与可视化

JUNG提供了多种图的布局算法和可视化选项,可以将图以可视化的方式展示出来。下面是一个使用JUNG绘制带有布局的无向图的示例代码:

import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.graph.UndirectedGraph;
import edu.uci.ics.jung.graph.UndirectedSparseGraph;
import edu.uci.ics.jung.visualization.VisualizationViewer;import javax.swing.JFrame;
import java.awt.Dimension;public class JUNGLayoutExample {public static void main(String[] args) {// 创建无向图UndirectedGraph<Integer, String> graph = new UndirectedSparseGraph<>();// 添加顶点graph.addVertex(1);graph.addVertex(2);graph.addVertex(3);graph.addVertex(4);// 添加边graph.addEdge("Edge 1", 1, 2);graph.addEdge("Edge 2", 2, 3);graph.addEdge("Edge 3", 3, 4);graph.addEdge("Edge 4", 4, 1);// 创建布局CircleLayout<Integer, String> layout = new CircleLayout<>(graph);// 创建可视化视图VisualizationViewer<Integer, String> vv = new VisualizationViewer<>(layout);vv.setPreferredSize(new Dimension(400, 300));// 创建窗口并显示可视化视图JFrame frame = new JFrame("JUNG Layout Example");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(vv);frame.pack();frame.setVisible(true);}
}

这个示例代码使用JUNG创建了一个带有布局的无向图。通过UndirectedSparseGraph类创建无向图对象,使用addVertex方法添加顶点,使用addEdge方法添加边。然后,使用CircleLayout类创建图的布局,将布局和图传入到VisualizationViewer类的构造函数中创建可视化视图。最后,将可视化视图添加到窗口中并显示出来。

2.3 图的算法与分析

2.3.1 最短路径算法

JUNG提供了最短路径算法,可以计算图中两个顶点之间的最短路径。下面是一个使用JUNG计算最短路径的示例代码:

import edu.uci.ics.jung.algorithms.shortestpath.DijkstraShortestPath;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseGraph;
import org.apache.commons.collections15.Transformer;public class JUNGShortestPathExample {public static void main(String[] args) {// 创建图Graph<Integer, String> graph = new SparseGraph<>();// 添加顶点graph.addVertex(1);graph.addVertex(2);graph.addVertex(3);graph.addVertex(4);// 添加边graph.addEdge("Edge 1", 1, 2);graph.addEdge("Edge 2", 2, 3);graph.addEdge("Edge 3", 3, 4);graph.addEdge("Edge 4", 4, 1);// 创建最短路径算法对象DijkstraShortestPath<Integer, String> shortestPath = new DijkstraShortestPath<>(graph, new Transformer<String, Double>() {@Overridepublic Double transform(String edge) {return 1.0; // 设置所有边的权重为1}});// 计算从顶点1到顶点3的最短路径System.out.println("从顶点1到顶点3的最短路径:");System.out.println(shortestPath.getPath(1, 3));}
}

这个示例代码使用JUNG计算了图中从顶点1到顶点3的最短路径。首先,创建了一个SparseGraph对象表示图,然后添加顶点和边。接着,创建了一个DijkstraShortestPath对象,并通过Transformer设置所有边的权重为1。最后,调用getPath方法计算最短路径并输出结果。

2.3.2 社区发现算法

JUNG还提供了社区发现算法,可以识别图中的社区结构。下面是一个使用JUNG进行社区发现的示例代码:

import edu.uci.ics.jung.algorithms.community.Community;
import edu.uci.ics.jung.algorithms.community.GirvanNewmanClusterer;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseGraph;import java.util.Set;public class JUNGCommunityDetectionExample {public static void main(String[] args) {// 创建图Graph<Integer, String> graph = new SparseGraph<>();// 添加顶点graph.addVertex(1);graph.addVertex(2);graph.addVertex(3);graph.addVertex(4);// 添加边graph.addEdge("Edge 1", 1, 2);graph.addEdge("Edge 2", 2, 3);graph.addEdge("Edge 3", 3, 4);graph.addEdge("Edge 4", 4, 1);// 使用Girvan-Newman算法进行社区发现GirvanNewmanClusterer<Integer, String> clusterer = new GirvanNewmanClusterer<>(2); // 2表示期望的社区数量Set<Set<Integer>> communities = clusterer.apply(graph);// 输出社区System.out.println("图中的社区:");for (Set<Integer> community : communities) {System.out.println(community);}}
}

这个示例代码使用JUNG的Girvan-Newman算法对图进行了社区发现。首先,创建了一个SparseGraph对象表示图,然后添加顶点和边。接着,创建了一个GirvanNewmanClusterer对象,并设置期望的社区数量为2。最后,调用apply方法进行社区发现,并输出结果。

3. JavaFX Charts

3.1 概述

JavaFX Charts是JavaFX框架内置的图表库,用于创建各种类型的图表,包括折线图、柱状图、饼图等。它提供了简单易用的API,可以轻松地创建和定制图表。

3.2 图表类型与用途

3.2.1 折线图

折线图用于展示数据随着时间、类别或其他变量的变化趋势。以下是一个使用JavaFX Charts绘制折线图的示例代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;public class JavaFXLineChartExample extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {// 创建x轴和y轴NumberAxis xAxis = new NumberAxis();NumberAxis yAxis = new NumberAxis();// 创建折线图LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);lineChart.setTitle("Line Chart Example");// 创建数据系列XYChart.Series<Number, Number> series = new XYChart.Series<>();series.setName("Series 1");// 添加数据series.getData().add(new XYChart.Data<>(1, 5));series.getData().add(new XYChart.Data<>(2, 4));series.getData().add(new XYChart.Data<>(3, 3));series.getData().add(new XYChart.Data<>(4, 2));series.getData().add(new XYChart.Data<>(5, 1));// 将系列添加到折线图中lineChart.getData().add(series);// 创建场景并显示折线图Scene scene = new Scene(lineChart, 400, 300);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

这个示例代码使用JavaFX Charts绘制了一个简单的折线图。它创建了一个NumberAxis作为x轴和y轴,然后创建一个LineChart对象,并设置标题。接着,创建一个XYChart.Series作为数据系列,添加一些数据点到系列中。最后,将系列添加到折线图中,创建一个Scene,并将折线图显示在舞台上。

3.2.2 饼图

饼图用于展示数据的相对比例或百分比。以下是一个使用JavaFX Charts绘制饼图的示例代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.stage.Stage;public class JavaFXPieChartExample extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {// 创建饼图数据PieChart.Data slice1 = new PieChart.Data("Category 1", 30);PieChart.Data slice2 = new PieChart.Data("Category 2", 20);PieChart.Data slice3 = new PieChart.Data("Category 3", 50);// 创建饼图PieChart pieChart = new PieChart(slice1, slice2, slice3);pieChart.setTitle("Pie Chart Example");// 创建场景并显示饼图Scene scene = new Scene(pieChart, 400, 300);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

这个示例代码使用JavaFX Charts绘制了一个简单的饼图。它创建了三个PieChart.Data对象作为饼图的数据,每个对象表示一个数据片段,并指定片段的名称和数值。然后,将这些数据片段传入PieChart的构造函数中创建饼图对象,并设置标题。最后,创建一个Scene并将饼图显示在舞台上。

3.2.3 柱状图

柱状图用于展示数据的比较或分布情况。以下是一个使用JavaFX Charts绘制柱状图的示例代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;public class JavaFXBarChartExample extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {// 创建x轴和y轴CategoryAxis xAxis = new CategoryAxis();NumberAxis yAxis = new NumberAxis();// 创建柱状图BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);barChart.setTitle("Bar Chart Example");// 创建数据系列XYChart.Series<String, Number> series = new XYChart.Series<>();series.setName("Series 1");// 添加数据series.getData().add(new XYChart.Data<>("Category 1", 10));series.getData().add(new XYChart.Data<>("Category 2", 20));series.getData().add(new XYChart.Data<>("Category 3", 30));series.getData().add(new XYChart.Data<>("Category 4", 40));series.getData().add(new XYChart.Data<>("Category 5", 50));// 将系列添加到柱状图中barChart.getData().add(series);// 创建场景并显示柱状图Scene scene = new Scene(barChart, 400, 300);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

这个示例代码使用JavaFX Charts绘制了一个简单的柱状图。它创建了一个CategoryAxis作为x轴和一个NumberAxis作为y轴,然后创建一个BarChart对象,并设置标题。接着,创建一个XYChart.Series作为数据系列,添加一些数据到系列中。最后,将系列添加到柱状图中,创建一个Scene,并将柱状图显示在舞台上。

3.3 图表样式与定制

3.3.1 颜色和样式

JavaFX Charts允许您定制图表的颜色和样式,以使其更符合您的应用程序主题或需求。您可以通过以下方式修改图表的样式:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;public class JavaFXBarChartCustomStyleExample extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {// 创建x轴和y轴CategoryAxis xAxis = new CategoryAxis();NumberAxis yAxis = new NumberAxis();// 创建柱状图BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);barChart.setTitle("Bar Chart Example");// 创建数据系列XYChart.Series<String, Number> series = new XYChart.Series<>();series.setName("Series 1");// 添加数据series.getData().add(new XYChart.Data<>("Category 1", 10));series.getData().add(new XYChart.Data<>("Category 2", 20));series.getData().add(new XYChart.Data<>("Category 3", 30));series.getData().add(new XYChart.Data<>("Category 4", 40));series.getData().add(new XYChart.Data<>("Category 5", 50));// 将系列添加到柱状图中barChart.getData().add(series);// 设置柱状图的样式barChart.lookup(".default-color0.chart-bar").setStyle("-fx-bar-fill: #FF0000;");barChart.lookup(".default-color1.chart-bar").setStyle("-fx-bar-fill: #00FF00;");barChart.lookup(".default-color2.chart-bar").setStyle("-fx-bar-fill: #0000FF;");barChart.lookup(".default-color3.chart-bar").setStyle("-fx-bar-fill: #FFFF00;");barChart.lookup(".default-color4.chart-bar").setStyle("-fx-bar-fill: #FF00FF;");// 创建场景并显示柱状图Scene scene = new Scene(barChart, 400, 300);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

这段代码演示了如何使用CSS样式来自定义柱状图的外观。您可以通过设置 -fx-bar-fill 来调整柱状图柱子的填充颜色。

3.3.2 标题和标签

JavaFX Charts允许您添加标题和标签以增强图表的可读性。您可以通过以下方式添加标题和标签:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;public class JavaFXBarChartCustomTitleLabelsExample extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {// 创建x轴和y轴CategoryAxis xAxis = new CategoryAxis();NumberAxis yAxis = new NumberAxis();// 创建柱状图BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);// 设置柱状图标题和轴标签barChart.setTitle("Custom Bar Chart Title");xAxis.setLabel("Custom X-Axis Label");yAxis.setLabel("Custom Y-Axis Label");// 创建数据系列XYChart.Series<String, Number> series = new XYChart.Series<>();series.setName("Series 1");// 添加数据series.getData().add(new XYChart.Data<>("Category 1", 10));series.getData().add(new XYChart.Data<>("Category 2", 20));series.getData().add(new XYChart.Data<>("Category 3", 30));series.getData().add(new XYChart.Data<>("Category 4", 40));series.getData().add(new XYChart.Data<>("Category 5", 50));// 将系列添加到柱状图中barChart.getData().add(series);// 创建场景并显示柱状图Scene scene = new Scene(barChart, 400, 300);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

这段代码展示了如何设置柱状图的标题和轴标签。您可以使用 setTitle() 方法来设置图表的标题,使用 setLabel() 方法来设置轴的标签。

4. Apache Batik (用于处理可扩展矢量图形SVG)

4.1 概述

Apache Batik是一个基于Java的开源库,用于处理可扩展矢量图形(SVG)。它提供了一组功能强大的API,用于读取、解析、创建和操作SVG图像。

4.2 功能与用途

Apache Batik的主要功能和用途包括:

  • SVG解析和生成:Batik可以读取和解析现有的SVG图像,并且还可以创建和生成新的SVG图形。
  • SVG渲染:Batik支持将SVG图像渲染到不同的输出设备上,如屏幕、图像文件、打印机等。
  • SVG操作:Batik提供了一组API,用于操作SVG图形,例如修改元素属性、添加、删除和移动元素等。
  • 动画和交互性:Batik支持SVG动画和交互性特性,可以创建动态的SVG图形和交互式的用户界面。

Apache Batik在许多领域都有广泛的应用,包括数据可视化、图形编辑器、地图绘制等。它为开发人员提供了处理和操作SVG图像的便捷方式。

4.3 SVG滤镜效果

除了基本的SVG图形绘制和操作功能外,Apache Batik还提供了强大的SVG滤镜效果支持。SVG滤镜效果可以让开发人员在SVG图像上应用各种视觉效果,如模糊、阴影、颜色变换等,从而增强图像的表现力和吸引力。

4.3.1 模糊滤镜

模糊滤镜效果可以用来创建柔和的阴影或模糊效果,使图像看起来更加柔和和自然。以下是一个简单的示例代码,演示如何在SVG图像上应用模糊滤镜效果:

import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;public class BlurFilterExample {public static void main(String[] args) {// 创建SVG文档DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation();String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;Document document = domImpl.createDocument(svgNS, "svg", null);// 创建模糊滤镜Element filter = document.createElementNS(svgNS, "filter");filter.setAttributeNS(null, "id", "blurFilter");Element gaussianBlur = document.createElementNS(svgNS, "feGaussianBlur");gaussianBlur.setAttributeNS(null, "in", "SourceGraphic");gaussianBlur.setAttributeNS(null, "stdDeviation", "5");filter.appendChild(gaussianBlur);document.getDocumentElement().appendChild(filter);// 创建矩形并应用滤镜Element rect = document.createElementNS(svgNS, "rect");rect.setAttributeNS(null, "x", "10");rect.setAttributeNS(null, "y", "10");rect.setAttributeNS(null, "width", "100");rect.setAttributeNS(null, "height", "100");rect.setAttributeNS(null, "fill", "blue");rect.setAttributeNS(null, "filter", "url(#blurFilter)");document.getDocumentElement().appendChild(rect);// 输出SVG文档System.out.println(document.getDocumentElement().toString());}
}
4.3.2 阴影效果

阴影效果可以使图像看起来更加立体和生动。Apache Batik提供了 <feDropShadow> 元素来实现阴影效果。以下是一个简单的示例代码:

import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;public class ShadowFilterExample {public static void main(String[] args) {// 创建SVG文档DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation();String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;Document document = domImpl.createDocument(svgNS, "svg", null);// 创建阴影滤镜Element filter = document.createElementNS(svgNS, "filter");filter.setAttributeNS(null, "id", "shadowFilter");Element dropShadow = document.createElementNS(svgNS, "feDropShadow");dropShadow.setAttributeNS(null, "dx", "5");dropShadow.setAttributeNS(null, "dy", "5");dropShadow.setAttributeNS(null, "stdDeviation", "3");dropShadow.setAttributeNS(null, "flood-color", "black");dropShadow.setAttributeNS(null, "flood-opacity", "0.5");filter.appendChild(dropShadow);document.getDocumentElement().appendChild(filter);// 创建矩形并应用滤镜Element rect = document.createElementNS(svgNS, "rect");rect.setAttributeNS(null, "x", "50");rect.setAttributeNS(null, "y", "50");rect.setAttributeNS(null, "width", "100");rect.setAttributeNS(null, "height", "100");rect.setAttributeNS(null, "fill", "red");rect.setAttributeNS(null, "filter", "url(#shadowFilter)");document.getDocumentElement().appendChild(rect);// 输出SVG文档System.out.println(document.getDocumentElement().toString());}
}

通过使用这些滤镜效果,开发人员可以在SVG图像中创建出更加生动和吸引人的视觉效果,提升用户体验。

5. Processing (用于创作互动图形和动画)

5.1 概述

Processing是一个基于Java的开源编程语言和开发环境,专门用于创作互动图形、动画和可视化效果。它提供了简单易用的API,使得艺术家、设计师和编程初学者都能够快速地创建各种图形和动画作品。

5.2 特点与应用场景

Processing的特点和应用场景包括:

  • 简单易用:Processing提供了简洁的API和直观的开发环境,使得编写图形和动画代码变得容易入门。
  • 互动性:Processing支持用户输入和响应,可以创建基于鼠标、键盘和触摸的交互式图形和动画。
  • 可视化效果:Processing提供了丰富的绘图和动画函数,可以创建各种可视化效果,如粒子系统、图形变换、图像处理等。
  • 扩展性:Processing基于Java语言,开发人员可以利用Java的强大功能进行高级编程和扩展。

Processing在艺术、设计、教育和科学研究等领域有广泛的应用。它被用于创作艺术作品、设计交互式界面、可视化数据、模拟物理系统等。Processing的开源性质也促进了社区的发展,有大量的代码示例和资源可供学习和分享。

5.3 绘图和形状

Processing提供了丰富的绘图函数和形状对象,使得开发人员能够轻松地创建各种图形和复杂的可视化效果。

5.3.1 绘制基本形状

Processing支持绘制多种基本形状,如点、线、矩形、椭圆等。以下是一个简单的示例代码,演示如何使用Processing绘制一个简单的图形:

import processing.core.PApplet;public class BasicShapes extends PApplet {public void settings() {size(400, 400); // 创建一个400x400像素的窗口}public void setup() {background(255); // 设置背景颜色为白色fill(255, 0, 0); // 设置填充颜色为红色stroke(0); // 设置边框颜色为黑色strokeWeight(2); // 设置边框宽度为2像素// 绘制一个矩形rect(100, 100, 200, 200);// 绘制一个椭圆ellipse(300, 300, 100, 100);}public static void main(String[] args) {PApplet.main("BasicShapes");}
}

在上面的代码中,我们使用 processing.core.PApplet 来提供Processing的基本功能。settings() 函数用于设置绘图环境,size() 函数创建一个指定大小的绘图窗口。setup() 函数则用于在窗口中绘制图形,background() 函数用于设置背景颜色,fill()stroke() 函数分别设置填充颜色和边框颜色,strokeWeight() 函数设置边框宽度。rect() 函数用于绘制矩形,ellipse() 函数用于绘制椭圆。

5.3.2 绘制复杂形状

除了基本形状外,Processing还支持绘制复杂的自定义形状。可以使用 beginShape()endShape() 函数来定义自定义形状的顶点,并使用 vertex() 函数指定每个顶点的坐标。以下是一个示例代码:

import processing.core.PApplet;public class CustomShape extends PApplet {public void settings() {size(400, 400);}public void setup() {background(255);fill(0, 0, 255);stroke(0);// 开始定义自定义形状beginShape();vertex(100, 100);vertex(200, 50);vertex(300, 150);vertex(200, 200);endShape(CLOSE); // 结束定义,并闭合形状}public static void main(String[] args) {PApplet.main("CustomShape");}
}

在这个示例中,我们使用 processing.core.PApplet 来提供Processing的基本功能。我们使用 beginShape() 开始定义自定义形状,然后使用 vertex() 函数定义每个顶点的坐标,最后使用 endShape(CLOSE) 结束定义,并闭合形状。这样就创建了一个四边形。

6. Apache POI (用于操作Microsoft Office文档)

6.1 概述

Apache POI是一个Java库,用于操作Microsoft Office文档,包括Excel、Word和PowerPoint文档。它提供了一组API,可以读取、写入和修改这些文档的内容和格式。

6.2 功能与应用

  • 读取和写入Excel文件:POI可以读取已存在的Excel文件,并且可以创建和写入新的Excel文件。
  • 单元格操作:POI可以对Excel中的单元格进行读写操作,包括设置值、获取值、设置样式等。
  • 公式计算:POI支持对Excel中的公式进行计算,并获取计算后的结果。
  • 图表生成:POI可以创建和编辑Excel中的图表

6.3 图表生成

Apache POI不仅可以读取、写入和修改Excel文档的内容,还可以在文档中生成各种类型的图表,包括折线图、柱状图、饼图等。下面是一个示例代码,演示如何使用Apache POI生成一个简单的柱状图:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.*;
import java.io.*;public class ExcelChartExample {public static void main(String[] args) {// 创建一个新的Excel工作簿Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("Chart Data");// 创建一些示例数据Row headerRow = sheet.createRow(0);headerRow.createCell(0).setCellValue("Category");headerRow.createCell(1).setCellValue("Value");String[] categories = {"A", "B", "C", "D"};int[] values = {10, 20, 15, 25};for (int i = 0; i < categories.length; i++) {Row row = sheet.createRow(i + 1);row.createCell(0).setCellValue(categories[i]);row.createCell(1).setCellValue(values[i]);}// 创建柱状图Drawing<?> drawing = sheet.createDrawingPatriarch();ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 10, 15);Chart chart = drawing.createChart(anchor);ChartLegend legend = chart.getOrCreateLegend();legend.setPosition(LegendPosition.BOTTOM);LineChartData data = chart.getChartDataFactory().createLineChartData();ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, categories.length, 0, 0));ChartDataSource<Number> ys = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, categories.length, 1, 1));data.addSeries(xs, ys);chart.plot(data, bottomAxis, leftAxis);// 保存Excel文件try {FileOutputStream fileOut = new FileOutputStream("chart_example.xlsx");workbook.write(fileOut);fileOut.close();workbook.close();System.out.println("Excel文件已生成!");} catch (IOException e) {e.printStackTrace();}}
}

在上面的代码中,我们使用Apache POI创建了一个新的Excel工作簿,并在其中添加了一些示例数据。然后,我们使用 createChart() 方法创建了一个柱状图,并将其插入到工作表中。最后,我们将工作簿保存为一个Excel文件。运行该代码将生成一个包含柱状图的Excel文件。

总结

数据可视化在今天的数据驱动世界中扮演着重要的角色。Java开发人员可以利用多个图表和图形库来创建丰富多样的图表和图形,以便更好地展示和理解数据。本文介绍了几个流行的Java图表和图形库,并提供了它们的概述、特点与优势、应用场景、使用示例以及图表样式和配置选项。读者可以根据自己的项目需求选择最适合的工具,并利用它们来创建令人印象深刻的数据可视化效果。

这篇关于【Java万花筒】数据可视化利器:Java图表和图形库全面对比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694871

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2