Java中如何基于集合内容绘制图?解析XML后绘图遇阻求助
解决HashMap存储的顶点边可视化问题
我来给你几个Java生态里实用的方案,能轻松把你这个HashMap<String, ArrayList<String>>里的顶点和边转成可视化的图:
方案1:用JGraphX(成熟的Java图形库)
JGraphX是Java平台上很流行的绘图库,支持交互式图形展示,步骤清晰易上手:
- 先引入Maven依赖(Gradle可自行转换):
<dependency> <groupId>com.mxgraph</groupId> <artifactId>mxgraph</artifactId> <version>4.2.2</version> </dependency>
- 编写代码将HashMap转成图形并展示:
import com.mxgraph.layout.mxOrganicLayout; import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.view.mxGraph; import javax.swing.*; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; public class GraphDrawer { public static void main(String[] args) { // 你的HashMap数据 HashMap<String, List<String>> graphData = new HashMap<>(); graphData.put("A", List.of("B", "C")); graphData.put("B", List.of("H", "J")); graphData.put("Y", List.of("Z")); mxGraph graph = new mxGraph(); Object parent = graph.getDefaultParent(); // 用Set避免重复添加顶点 Set<String> vertices = new HashSet<>(); vertices.addAll(graphData.keySet()); graphData.values().forEach(vertices::addAll); // 开始构建图形 graph.getModel().beginUpdate(); try { // 先添加所有顶点,用Map存起来方便后续关联边 HashMap<String, Object> vertexMap = new HashMap<>(); for (String vertex : vertices) { vertexMap.put(vertex, graph.insertVertex(parent, null, vertex, 0, 0, 80, 30)); } // 添加所有边 for (String source : graphData.keySet()) { for (String target : graphData.get(source)) { graph.insertEdge(parent, null, "", vertexMap.get(source), vertexMap.get(target)); } } // 自动布局图形,避免顶点重叠 new mxOrganicLayout(graph).execute(parent); } finally { graph.getModel().endUpdate(); } // 弹出窗口展示图形 JFrame frame = new JFrame("Graph Visualization"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new mxGraphComponent(graph)); frame.setSize(800, 600); frame.setVisible(true); } }
运行后会得到一个交互式窗口,你可以拖拽顶点调整位置,缩放查看细节。
方案2:用GraphStream(轻量级快速可视化)
如果想要更简洁的实现,GraphStream的API更直观,代码量更少:
- 引入Maven依赖:
<dependency> <groupId>org.graphstream</groupId> <artifactId>gs-core</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>org.graphstream</groupId> <artifactId>gs-ui</artifactId> <version>2.0</version> </dependency>
- 核心代码:
import org.graphstream.graph.Graph; import org.graphstream.graph.Node; import org.graphstream.graph.implementations.SingleGraph; import java.util.HashMap; import java.util.List; public class GraphStreamDrawer { public static void main(String[] args) { HashMap<String, List<String>> graphData = new HashMap<>(); graphData.put("A", List.of("B", "C")); graphData.put("B", List.of("H", "J")); graphData.put("Y", List.of("Z")); // 创建图形实例 Graph graph = new SingleGraph("My Graph"); // 简单设置样式,让节点更美观 graph.setAttribute("ui.stylesheet", "node { fill-color: lightblue; text-size: 16; }"); graph.setAttribute("ui.quality"); graph.setAttribute("ui.antialias"); // 遍历数据添加节点和边 for (String source : graphData.keySet()) { // 确保节点存在,重复添加不会报错 Node sourceNode = graph.addNode(source); sourceNode.setAttribute("ui.label", source); for (String target : graphData.get(source)) { Node targetNode = graph.addNode(target); targetNode.setAttribute("ui.label", target); // 用source-target作为边的唯一ID,避免重复添加同一条边 graph.addEdge(source + "-" + target, source, target); } } // 直接显示图形 graph.display(); } }
运行后会弹出一个自动布局的图形窗口,支持缩放、拖拽等操作,上手非常快。
方案3:生成Graphviz DOT文件(非GUI,生成静态图片)
如果你不需要交互式窗口,只想生成静态图片,可以先生成Graphviz的DOT格式文本,再用Graphviz工具渲染成PNG/SVG等格式:
- 生成DOT文件的代码:
import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.List; public class DotFileGenerator { public static void main(String[] args) { HashMap<String, List<String>> graphData = new HashMap<>(); graphData.put("A", List.of("B", "C")); graphData.put("B", List.of("H", "J")); graphData.put("Y", List.of("Z")); // 构建DOT格式内容 StringBuilder dotBuilder = new StringBuilder(); dotBuilder.append("digraph MyGraph {\n"); dotBuilder.append(" node [shape=box, style=filled, color=lightblue];\n"); for (String source : graphData.keySet()) { for (String target : graphData.get(source)) { dotBuilder.append(" ").append(source).append(" -> ").append(target).append(";\n"); } } dotBuilder.append("}"); // 保存到本地文件 try (FileWriter writer = new FileWriter("graph.dot")) { writer.write(dotBuilder.toString()); } catch (IOException e) { e.printStackTrace(); } } }
- 安装Graphviz工具后,执行命令生成图片:
dot -Tpng graph.dot -o graph.png
执行完就能得到一张静态的有向图图片,适合嵌入文档或报告。
内容的提问来源于stack exchange,提问作者SpaceyBot
相关产品推荐
相关产品推荐

