【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

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("