【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

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

可视化实训复习篇章

前言: 今天,我们来学习seaborn库可视化,当然,这个建立在Matplotlib的基础上,话不多说,进入今天的正题吧!当然,这个是《python数据分析与应用》书中,大家有需求的可以参考这本书。 知识点: Matplotlib中有两套接口分别是pyplot和pyylab,即绘图时候主要导入的是Matplotlib库下的两个子模块(两个py文件)matplotlib.pyplot和matp

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001