【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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定