【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

相关文章

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St