DiagrammeR 和 MathJax 无法正确呈现 rmarkdown 文档中的图形

Posted

技术标签:

【中文标题】DiagrammeR 和 MathJax 无法正确呈现 rmarkdown 文档中的图形【英文标题】:DiagrammeR and MathJax do not correctly render a graph in a rmarkdown document 【发布时间】:2022-01-21 12:12:43 【问题描述】:

我正在使用下面的rmarkdown 示例,它没有显示符号theta 也没有显示图的标题,并且第一个节点太宽(见下面的输出):

---
title: "Untitled"
output: html_document
---

The example is:

```r nnet02, echo=F, fig.cap="Multilayer"
library(DiagrammeR)

add_mathjax(
grViz("digraph G1 
  graph [layout=neato overlap = true]     
  I1 [pos='1,1!'    style=radial label='$\\\\theta$']
  I2 [pos='2,1!'    style=radial]

  I1 -> I2
", width = 550))
```

你能帮帮我吗?

【问题讨论】:

Theta 正在被我消失?你也是? 我可以为您提供下一个解决方案,一分钟。 你可以使用html labels 例如label='θ'。另请参阅graphviz docs @PaulSmith ; graphviz 采用 html 标签,因此您可以使用 <sup><sub> 哦,是的,让我想起了这个***.com/questions/39334738/…。 【参考方案1】:

据我所知,我们可以在 Unicode 中找到所有必要的符号。

(Mathjax 是多余的?)

您修改后的代码:

---
title: "Untitled"
output: html_document
---

The example is:

```r nnet02, echo=F, fig.cap="Multilayer"
library(DiagrammeR)


grViz("digraph G1 
  graph [layout=neato overlap = true]     
  I1 [pos='1,1!'    style=radial label='\U03B8' fontsize=15]
  I2 [pos='2,1!'    style=radial fontsize=15]

  I1 -> I2
", width = 550)
```

有 sups 和 subs:

  ***
  I1 [pos='1,1!'    style=radial label=  '\U03B8\U00B3'  fontsize=10]
  I2 [pos='2,1!'    style=radial label=  '\U03B8\u2085'  fontsize=10]
  ***


一些额外的想法

我们可以在查看器中绘制我们的图表(使用 MJ)。 导出为图片并添加到我们的 RMarkdown。

【讨论】:

@PaulSmith 当然可以。一瞬间。准备好了。 @PaulSmith 这个资源对你很有用:unicode-table.com/en/sets/superscript-and-subscript-letters @PaulSmith 我不知道 :) 我们可以更改字体和外观。等等) @PaulSmith 所以,字体没有帮助。关于 Mathjax 和消失。我们有问题,因为我们的图表有 .SVG 输出。我试图找到一个解决方案,如何将 MJ 嵌入到 SVG,但无法做到。也许你会处理。我很高兴看到它。 F.e. label= <<foreignObject> ... </foreignObject>> 不工作... 谢谢,@manro!我怀疑这是add_mathjax 的错误。同时,我针对Diagrammer(在 GitHub 中)提交了一个错误。让我们等待反馈。【参考方案2】:

在@user20650 提到问题Improve positioning of subscript and superscript on node labels 之后,可以构建一种解决方法:

    cat chunk 中写入graphviz dot 代码,随后将保存为gv 文件:
cat, engine.opts=list(file = 'sample.gv')
digraph G1 
  graph [layout=neato overlap = true];
  I1 [pos="1,1!" label="\\theta^2_j"  shape="circle"];
  I2 [pos="2,1!" label="\\sum_i=1^n I_i"  shape="circle"];

  I1 -> I2;

    r chunk 中,调用dot2tex (dot2tex) 将gv 文件转换为LaTeX tikz 图片。接下来,将tex 文件编译为pdf 并对其进行裁剪。最后,将裁剪后的pdf 图形转换为svg 格式(使用dvisvgm、dvisvgm):
r echo=F
system("dot2tex --prog=neato --autosize -f tikz -t math sample.gv > sample.tex")
system("pdflatex sample.tex")
system("pdfcrop sample.pdf sample.pdf")
system("dvisvgm --pdf sample.pdf")
    最后,一个r chunksvg 图包含到rmarkdown 文档中:
r echo=F, fig.cap="My caption.", out.width=500
knitr::include_graphics("sample.svg")

结果是:

【讨论】:

这真的很有用......可能是一种将它构建到 knitr hook 之类的方法;我以后可能会去 我想是的,@user20650。而且由于add_mathjax 有问题,我的解决方法也可以用来重写他们的add_mathjax。我针对Diagrammer 提交了一个错误,但没有人回答...很多很多问题都没有任何回复...

以上是关于DiagrammeR 和 MathJax 无法正确呈现 rmarkdown 文档中的图形的主要内容,如果未能解决你的问题,请参考以下文章

CKEDITOR mathjax公式在jquery中未正确加载

使用 mPDF 将 MathJax 方程输出到 PDF 时未正确对齐

DiagrammeR:调整节点内的字体大小

diagrammeR - 改编自“如何在我的流程图中添加武器?”

在 Word 文档中使用 DiagrammeR(使用 rMarkdown 生成)

Mermaid DiagrammeR 之旅