在rmarkdown文件中可以使用DiagrammeR包插入流程图之类的示意图。可以选择插入Graphviz和Mermaid。

Mermaid

Mermaid语法和很多markdown编辑器比如obsidian里有很好的集成。也可以在线画图,然后导出png或者直接使用生成的链接。网址:https://mermaid.live/

1
2
3
4
5
6
library(DiagrammeR)
mermaid("graph LR
A(( )) -->|否| B[Level 2]
A --> |是| C[Level1]
C --> B
",height='100%',width='100%')

但是Mermaid在rmarkdown中进行pdf渲染时会出现一小块空白。 这里代码为:

1
2
3
4
5
6
7
```{r,echo=FALSE,dev='png'}
library(DiagrammeR)
mermaid("graph LR
因变量数据正态分布--yes-->lm和glm都行
因变量数据正态分布--no-->glm
",height='100%',width='100%')
```

Graphviz

而Graphviz并不比Mermaid复杂,除了不会在pdf渲染时出错,在修改颜色形状以及大量连线方面都颇有优势。在线画图网站:https://dreampuf.github.io/GraphvizOnline/

不用箭头而连线连接

1
2
3
4
5
DiagrammeR::grViz("
graph G {
 A -- B
}
",height=400,width='100%')

用箭头连接

1
2
3
4
5
DiagrammeR::grViz("
digraph G {
 A -> B
}
",height=400,width='100%')

改变node和edge样式

1
2
3
4
5
6
7
8
9
DiagrammeR::grViz("
digraph G {
 node [shape=squre,style=filled,color=yellow]
 edge [style=dotted,color=red]
 A[color=red]
 B[color=blue]
 {A,B,C} -> {D,E,F}
}
",height=400,width='100%')

不要总是一边连到另一边

1
2
3
4
5
6
DiagrammeR::grViz("
digraph G {
 layout=neato;
 A -> {B,C,D,E,F,G,F}
}
",height=400,width='100%')

稍微复杂一点的成品

  • splines=false:强制连线是直线,如果出现丑陋的曲线可以使用这个命令。
  • rankdir=LR:从左到右的顺序
  • arrowhead: 箭头形状
  • subgraph: 用框框起来,还可以加字
  • 注意DiagrammeR::grViz(’’)最好用单引号,这样里面包含的graphviz的语法就可以用双引号,虽然graphviz语法单引号和双引号都不会影响在rmarkdown里的渲染,但是graphviz的标准格式是双引号。
  • height=400,width=‘100%’:这两条命令控制图形的大小。height=400,最大高度为400px,这样窄长型的图比如前两张就不会变得极大。width=‘100%,’宽度最大填满整个容器。这样图片会自动适应屏幕的宽度,用手机看的时候也不会太大。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
DiagrammeR::grViz('
digraph G {
splines=false;
rankdir =LR;
 
node [shape = circle,
       style = filled,
       color = grey25,
       label=""]
edge [color = grey25,arrowhead = vee]
 
subgraph cluster_0{
node [fillcolor = red3]
a b c
label="Eingabeschicht"
style=filled;
color=lightgrey;
}
 
subgraph cluster_1{
node [fillcolor = blue3]
d e f g
label="verborgene Schicht"
style=filled;
color=lightgrey;
}

subgraph cluster_2{
node [fillcolor = green3]
h i
label="输出层"
style=filled;
color=lightgrey;
}

{a b c}->{d e f g}->{h i}

}
',height=400,width='100%')