ggdag 绘制DAG和因果图

本文介绍了如何使用R语言的ggdag包创建和绘制有向无环图(DAG)和因果图。ggdag基于dagitty和ggplot2,提供了tidy_dagitty函数整理DAG数据结构,以及dagify()函数创建DAG。此外,文章还展示了如何使用ggdag中的各种函数进行图形绘制,包括geom_dag_node(), geom_dag_edges()等,以及如何利用dplyr和管道操作增强绘图功能。" 112911088,8337215,WPF表格数据的全选与行选操作实现,"['WPF', '前端开发', '数据操作']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有向无环图(DAG,Direct Acyclic Graph)是一种图模型。图由节点和边组成,节点代表变量,边代表变量之间的某种联系。如果两个节点之间的边是有明确指向的,就是有向图。如果一个有向图从某个节点出发后,无法通过若干条边回到原节点,就是一个有向无环图。贝叶斯网是有向无环图的一个著名的例子。

dagitty(有个对应的R包,也叫dagitty)是一个功能强大的基于浏览器的因果模型图分析工具。ggdag对dagitty包做了一些扩展,可以创建整洁(tidy)的因果有向无环图。ggdag的图形建立在ggplot2和ggraph(见网络数据可视化(3修订版)ggraph:ggplot2的网络可视化)的基础上,可以在R环境下更轻松的绘制DAG。

ggdag可以直接将dagitty包创建的DAG转化为整洁的数据结构。

library(dagitty)
library(ggdag
在 Java 中绘制 DAG (有向无环图) 可能会涉及图形库的使用,例如 JUNG (Java Universal Network/Graph Framework) 或者 GraphStream。以下是使用 JUNG 进行简单 DAG绘制的一个简要步骤: 1. 添加依赖:首先需要在项目中引入 JUNG 的库,你可以通过 Maven 或 Gradle 等构建工具添加依赖。 ```xml <!-- Maven --> <dependency> <groupId>org.jgrapht</groupId> <artifactId>jgrapht-core</artifactId> <version>0.9.1</version> </dependency> <!-- Gradle --> implementation 'org.jgrapht:jgrapht-core:0.9.1' ``` 2. 创建节点边:定义 `Vertex` 类表示图中的节点,以及 `Edge` 类表示连接两个节点的关系。 ```java import org.jgrapht.graph.DefaultDirectedGraph; import org.jgrapht.graph.DirectedGraph; public class DirectedAcyclicGraph { private final DefaultDirectedGraph<Vertex, Edge> dag = new DefaultDirectedGraph<>(DefaultEdge.class); } ``` 3. 添加节点边:使用 `dag.addVertex()` 添加节点,`dag.addEdge()` 添加边,并指定起点终点。 ```java Vertex vertex1 = dag.addVertex("Node A"); Vertex vertex2 = dag.addVertex("Node B"); dag.addEdge(new DefaultEdge(vertex1, vertex2), "Edge AB"); ``` 4. 绘制图形:使用 JUNG 提供的可视化工具,如 JUNG Viewer 或者第三方库,将图转换为可视化的组件并显示出来。 5. 示例代码片段: ```java import edu.uci.ics.jung.algorithms.layout.FRLayout; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.control.ClickableCellRenderer; import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position; // ... FRLayout layout = new FRLayout(dag); // 使用 Fruchterman-Reingold 算法布局 layout.setSize(new Dimension(600, 600)); // 设置视图大小 VisualizationViewer<Vertex, Edge> vv = new VisualizationViewer<>(layout); vv.setPreferredSize(new Dimension(600, 600)); vv.getRenderContext().setVertexLabelTransformer(vertex -> vertex.getUserObject()); vv.getRenderContext().setVertexLabelPosition(Position.CNTR); vv.getRenderContext().setEdgeArrowShape(EdgeLabelledShapeProvider.createArrow()); vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); // 添加点击事件监听,以便获取点击的节点信息 vv.setCellRenderer(new ClickableCellRenderer<Vertex>() { @Override public void customizeVertexRenderer(Vertex v, Renderer.VertexLabel vl) { vl.setHorizontalAlignment(v.getLabel() instanceof String ? Label.HorizontalAlignment.CENTER : HorizontalAlignment.LEFT); } }); // 显示图表 new JFrame().add(vv).pack().setVisible(true); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrrunsen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值